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 , '=');
//…

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.


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.


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);

10

Contoh sederhana:

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

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');

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();

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.