เงื่อนไข“ OR” ใน db_select ()


51

ฉันกำลังศึกษาเลเยอร์ฐานข้อมูลใหม่และฉันดีใจที่มันเปลี่ยนเป็นเลเยอร์ OOP db_select()ฉันต้องใช้แบบสอบถามกับ ฉันพบว่าฉันสามารถเพิ่มWHEREคำสั่งด้วย$query->condition()แต่โดยค่าเริ่มต้นเงื่อนไขจะถูกรวมเข้าด้วยกัน

ฉันหรือเงื่อนไขด้วยกันได้อย่างไร?

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

คำตอบ:


81

ไม่ถูกต้องค่าเริ่มต้นคือ AND ในการใช้หรือคุณต้องใช้:

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

แต่เงื่อนไขหลักของการสืบค้นจะเชื่อมโยงกับ AND อย่างแน่นอน


30

คุณสามารถใช้สิ่งนี้สำหรับการสร้างหรือระหว่าง 2 เงื่อนไข ByDefault มันคือ 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();

เป็นไปได้ที่จะมี AND เงื่อนไขภายในหรือสมมติว่าคุณมี 3 เงื่อนไขและถ้าคุณต้องการให้มันเป็นเช่น con1 AND con2 หรือ con3 และแม้กระทั่งกรณีอื่น ๆ อีกมากมายในกรณีนี้คุณสามารถใช้ db_and เช่น db_or เพราะเมื่อคุณพยายามใช้ db_or ทั้งหมด เงื่อนไขภายใน db_or ใช้เวลาในกรณีที่คุณต้องการและระหว่างเงื่อนไขเหล่านั้นคุณสามารถใช้ db_and ที่น่าเบื่อเล็กน้อย แต่มีความเป็นไปได้ที่จะใช้มันเป็นตัวอย่างด้านล่าง

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

นี่จะทำให้คุณทราบว่าจะสามารถจัดการความซับซ้อนและเงื่อนไขในแบบสอบถาม Drupal PDO ได้อย่างไร


22

ตามเอกสาร คู่มือฐานข้อมูล drupal 7 ค่าเริ่มต้นคือและเงื่อนไข แต่ถ้าคุณต้องการใช้หรือเงื่อนไขแล้วใช้สิ่งนี้;

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

10

ตัวอย่างง่ายๆ:

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

1

โดยค่าเริ่มต้นจะมีเงื่อนไขและสำหรับเงื่อนไข OR ต้องเพิ่ม db_or () ภายในเงื่อนไข

$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

โซลูชัน db_or () จะไม่ทำงานเมื่อคุณสร้างเคียวรีที่ซับซ้อนซึ่งคุณต้องการให้เงื่อนไขส่วนใหญ่เชื่อมโยงกับ AND และเพียงหนึ่งหรือบางส่วนหรือเงื่อนไข

ฉันพบกรณีเช่นนี้ซึ่งฉันมีเงื่อนไขอยู่แล้วและฉันไม่ต้องการให้เป็นหรือเงื่อนไข ฉันสามารถใช้วิธีwhere ()แทนเงื่อนไขเพื่อเพิ่มส่วนคำสั่งอื่นที่มี OR นี่คือตัวอย่างที่คล้ายกับการสืบค้นที่ฉันใช้กับวิธีการที่นั่นใกล้ถึงจุดสิ้นสุด:

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

คำตอบนี้ไม่ถูกต้อง: db_or()ยังทำงานได้เมื่อมีเพียงสองเงื่อนไขที่ต้อง OR'ed จาก 5 เงื่อนไขที่ AND'ed ไม่จำเป็นต้องใช้$query->where()สำหรับกรณีดังกล่าว
kiamlaluno

ขอบคุณสำหรับคำชี้แจงว่าจะใช้อย่างไรในกรณีนั้น db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025

1
คุณต้องใช้สิ่งที่คล้ายกับdb_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); $a AND $b AND ($c OR $d) AND $eสภาพที่เกิดขึ้นจะเป็น ฉันใช้รหัสหลอก db_or()เป็นฟังก์ชั่นไม่ใช่วิธีการ; db_select()->condition()->db_or()จะส่งคืนข้อผิดพลาดเกี่ยวกับวิธีการที่ไม่ได้กำหนดไว้
kiamlaluno

ตกลงฉันเข้าใจแล้ว ขอบคุณอีกครั้งสำหรับคำอธิบาย ฉันรู้สึกว่ามันเป็นวิธีการ ดังนั้นมันจะทำงานได้ดีสำหรับปัญหาของฉัน
tcm5025

0

สำหรับ Drupal 8 คุณสามารถใช้เช่น:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.