Điều kiện OR OR trong db_select ()


51

Tôi đang nghiên cứu lớp cơ sở dữ liệu mới và tôi rất vui vì nó được đổi thành lớp OOP. Tôi cần phải thực hiện một truy vấn với db_select(). Tôi thấy tôi có thể thêm một WHEREcâu lệnh với $query->condition(), nhưng theo mặc định, các điều kiện được AND cùng nhau.

Làm thế nào tôi có thể HOẶC các điều kiện với nhau?

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

Câu trả lời:


81

Điều đó không chính xác, mặc định là AND. Để sử dụng hoặc, bạn cần sử dụng:

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

Nhưng các điều kiện chính trên truy vấn chắc chắn được kết hợp với AND.


30

Bạn có thể sử dụng cái này để tạo OR giữa 2 điều kiện ByDefault, nó là 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();

Có thể có điều kiện AND trong OR giả sử bạn có 3 điều kiện và nếu bạn muốn nó giống như con1 AND con2 HOẶC con3 và thậm chí nhiều trường hợp khác trong trường hợp này, bạn có thể sử dụng db_and như db_or vì khi bạn đang cố gắng sử dụng db_or các điều kiện trong db_or hiện có trong trường hợp bạn muốn và giữa những điều kiện bạn có thể sử dụng db_and hơi tẻ nhạt nhưng có thể thực hiện nó theo ví dụ dưới đây

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

Điều này sẽ cho bạn biết làm thế nào phức tạp và hoặc điều kiện có thể được xử lý trong các truy vấn PDO của Drupal.


22

Theo tài liệu cơ sở dữ liệu drupal 7 , mặc định là điều kiện AND , nhưng nếu bạn muốn sử dụng điều kiện OR thì hãy sử dụng điều kiện này;

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

10

Ví dụ đơn giản:

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

1

Theo mặc định, có điều kiện AND, đối với điều kiện OR cần thêm db_or () bên trong điều kiện.

$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

Giải pháp db_or () sẽ không hoạt động khi bạn đang xây dựng một truy vấn phức tạp trong đó bạn muốn hầu hết các điều kiện được kết hợp với AND và chỉ một hoặc một số điều kiện OR.

Tôi gặp phải trường hợp như thế này khi tôi đã có điều kiện và tôi không muốn chúng là điều kiện HOẶC. Tôi đã có thể sử dụng phương thức where () thay vì điều kiện để thêm một mệnh đề khác có chứa OR. Đây là một ví dụ tương tự như truy vấn tôi đã sử dụng với phương thức where ở gần cuối:

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

Câu trả lời này không chính xác: db_or()cũng hoạt động khi chỉ có hai điều kiện cần OR trong số 5 điều kiện được AND'ed. Không cần phải sử dụng $query->where(), cho trường hợp như vậy.
kiamlaluno

Cảm ơn đã làm rõ, làm thế nào nó sẽ được sử dụng trong trường hợp đó sau đó? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025

1
Bạn cần sử dụng một cái gì đó tương tự db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); điều kiện kết quả sẽ là $a AND $b AND ($c OR $d) AND $e. Tôi đang sử dụng mã giả. db_or()là một hàm, không phải là một phương thức; db_select()->condition()->db_or()sẽ trả về một lỗi về một phương thức không được xác định.
kiamlaluno

OK tôi hiểu rồi. Cảm ơn một lần nữa cho lời giải thích. Tôi đã có ấn tượng rằng đó là một phương pháp. Vì vậy, nó cũng sẽ làm việc cho vấn đề của tôi.
tcm5025

0

Đối với Drupal 8, bạn có thể sử dụng, ví dụ:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.