Kondisi "ATAU" di db_select ()

51

Saya sedang mempelajari lapisan basis data baru, dan saya senang itu diubah menjadi lapisan OOP. Saya perlu menerapkan kueri dengan db_select(). Saya menemukan saya dapat menambahkan WHEREpernyataan $query->condition(), tetapi secara default kondisinya adalah AND'ed bersama.

Bagaimana saya ATAU kondisinya bersama?

$query=db_select('users','u')->fields('u',array('uid','title','created','uid'));
$query->join('flag_content','fc' , 'u.uid = fc.content_id');
$query->condition('fc.fid', '5' , '=');
$query->condition('fc.uid', $uid , '=');
//…
Yusef
sumber

Jawaban:

82

Itu tidak benar, standarnya adalah AND. Untuk menggunakan atau, Anda perlu menggunakan:

$or = db_or();
$or->condition();
$or->condition();
$query->condition($or);

Tetapi kondisi utama pada permintaan pasti bergabung dengan AND.

Berdir
sumber
30

Anda dapat menggunakan ini Untuk membuat ATAU antara 2 kondisi, ByDefault itu adalah AND

$query=db_select('users','u')->fields('u',array('uid','title','created','uid'));
$query->join('flag_content','fc' , 'u.uid = fc.content_id');

$db_or = db_or();
$db_or->condition('fc.fid', '5' , '=');
$db_or->condition('fc.uid', $uid , '=');
$query->condition($db_or);

$result = $query->execute()->fetchAll();

Dimungkinkan untuk memiliki kondisi AND di dalam ATAU misalkan Anda memiliki 3 kondisi dan jika Anda menginginkannya seperti con1 DAN con2 ATAU con3 dan bahkan banyak kasus lain dalam kasus ini Anda dapat menggunakan db_and seperti db_or karena ketika Anda mencoba menggunakan db_or semua kondisi dalam db_or sekarang jika Anda ingin dan di antara yang dapat Anda gunakan db_and yang sedikit membosankan tetapi mungkin untuk menerapkannya berikut contoh di bawah ini

 $query = db_select('work_details_table','wd');
$query->join('work_table','w','wd.request_id = w.request_id');
$query->fields('w',array('client_id'));
$query->fields('wd');
$query->condition('wd.request_id',$request_id);
if($status == 5 || $status == 6 || $status == 7){
  $query->condition('wd.status',$status);
}elseif($user_type == 'writer'){
  $query->condition('wd.writer_id',$user_id);  
  $db_or = db_or();
  $db_and = db_and();
    $db_and->condition('wd.status',2);
    $db_and->isNull('wd.editor_id');
  $db_or->condition('wd.status',4);
  $db_or->condition('wd.status',1);
  $db_or->condition($db_and);
  $query->condition($db_or);
}else if($user_type == 'editor'){
  $query->condition('wd.editor_id',$user_id);
  $db_or = db_or();
  $db_and = db_and();
    $db_and->condition('wd.status',2);
    $db_and->isNotNull('wd.editor_id');
  $db_or->condition('wd.status',3);
  $db_or->condition($db_and);
  $query->condition($db_or); 
}
//-----------------------------------------------------------------------------------------
$completed_sku = $query->execute()->fetchAll();

Ini akan memberi Anda gambaran bagaimana kompleks dan atau kondisi dapat ditangani dalam permintaan PDO Drupal.

umesh
sumber
23

Menurut dokumentasi database drupal 7 , standarnya adalah kondisi AND , tetapi jika Anda ingin menggunakan ATAU kondisi maka gunakan ini;

$db_or = db_or();
$db_or->condition('n.type', 'event', '=');
$db_or->condition('n.type', 'article', '=');
$query->condition($db_or);
zhilevan
sumber
10

Contoh sederhana:

$nodes = db_select('node', 'n')
->fields('n')
->condition(
 db_or()
   ->condition('uid', 1)
   ->condition('status', 0)
 )
->execute()
->fetchAll();
Plazik
sumber
1

Secara default ada kondisi AND, untuk kondisi OR perlu menambahkan db_or () di dalam kondisi.

$query = db_select('soccer_team"', 'n');
$query->fields('n',array('stid','title'))//SELECT the fields from node
        ->fields('n',array('title'))//SELECT the fields from user
            ->condition(
             db_or()
            ->condition('title','%ace%','LIKE')
            ->condition('title','%alb%','LIKE')
            )
        ->orderBy('title', 'ASC');
Bijaya Kumar Oli
sumber
0

Solusi db_or () tidak akan berfungsi ketika Anda membangun kueri yang kompleks di mana Anda ingin sebagian besar kondisi digabungkan dengan AND dan hanya satu atau beberapa kondisi ATAU.

Saya mengalami kasus seperti ini di mana saya sudah memiliki kondisi, dan saya tidak ingin mereka menjadi kondisi ATAU. Saya bisa menggunakan metode where () alih-alih syarat untuk menambahkan klausa lain yang menyertakan OR. Berikut ini contoh yang mirip dengan kueri yang saya gunakan dengan metode di mana di dekat akhir:

$query = db_select('users');
$query->join('user_join', NULL, 'users.uid = userid');
$query->join('field_data_account', NULL, 'appid = entity_id');
$query->leftJoin('users_roles', 'roles', 'users.uid = roles.uid');
$query->condition('account_target_id', $form['#account_id']);
$query->condition('userid', $lab_user->uid);
$query->where('appid <> :app_id OR rid = :rid', array(
    ':app_id' => $form['#app_id'],
    ':rid' => $role->rid,
))->fields('users')->countQuery();
$result = $query->execute()->fetchField();
tcm5025
sumber
Jawaban ini tidak benar: db_or()berfungsi juga ketika hanya ada dua kondisi yang perlu OR'ed dari 5 kondisi yang AND'ed. Tidak perlu menggunakan $query->where(), untuk kasus seperti itu.
kiamlaluno
Terima kasih atas klarifikasi, lalu bagaimana itu akan digunakan dalam kasus itu? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025
1
Anda perlu menggunakan sesuatu yang mirip dengan db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); kondisi yang dihasilkan akan $a AND $b AND ($c OR $d) AND $e. Saya menggunakan pseudo-code. db_or()adalah fungsi, bukan metode; db_select()->condition()->db_or()akan mengembalikan kesalahan tentang metode yang tidak didefinisikan.
kiamlaluno
OK saya mengerti. Terima kasih lagi untuk penjelasannya. Saya mendapat kesan bahwa itu adalah metode. Jadi itu juga akan berhasil untuk masalah saya.
tcm5025
0

Untuk Drupal 8 Anda dapat menggunakan mis:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
Martin Klima
sumber