db_select()中的“ OR”条件


51

我正在研究新的数据库层,很高兴将其更改为OOP层。我需要使用实现查询db_select()。我发现我可以使用添加一条WHERE语句$query->condition(),但是默认情况下条件是AND在一起的。

我如何才能将条件或在一起?

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

Answers:


81

这是不正确的,默认值为AND。要使用或,您需要使用:

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

但是查询的主要条件肯定与AND结合在一起。


30

您可以使用此方法在2个条件之间进行OR,默认情况下为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();

假设您有3个条件,并且可能有AND条件,并且如果您希望它像con1 AND con2 OR con3一样,并且在这种情况下甚至还有很多其他情况,则可以使用db_and,例如db_or,因为当您尝试使用db_or all时如果需要,db_or中的条件现在就可以使用了,在这些条件之间可以使用db_,这虽然很繁琐,但是可以在下面的示例中实现

 $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 数据库文档 ,默认值为AND条件,但是如果要使用OR条件,则使用此条件;

$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

默认情况下有AND条件,因为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

当您构建一个复杂的查询时,如果您希望大多数条件与AND结合在一起,而仅一个或某些OR条件结合起来,则db_or()解决方案将无法工作。

我遇到了这样的情况:我已经有条件,但我不希望它们成为OR条件。我能够使用where()方法代替条件来添加另一个包含OR的子句。这是一个类似于我在末尾使用where方法的查询的示例:

$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()在5个条件进行“与”运算的条件中,只有两个条件需要进行“或”运算时,也可以使用。在$query->where()这种情况下,无需使用。
kiamlaluno

感谢您的澄清,那么在那种情况下该如何使用?db_select()-> condition()-> condition()-> db_or()-> condition()??
tcm5025 2012年

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.