db_select()の「OR」条件


51

私は新しいデータベース層を研究していますが、それがOOP層に変更されてうれしいです。でクエリを実装する必要がありますdb_select()。でWHEREステートメントを追加できることがわかりました$query->condition()が、デフォルトでは条件はANDで結合されています。

条件を一緒にORするにはどうすればよいですか?

$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つの条件ByORの間で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();

OR内にAND条件を設定することは可能です。3つの条件があり、con1 AND con2 OR con3のようにしたい場合、この場合は他の多くのケースを均等にしたい場合は、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 データベースのドキュメントによると 、デフォルトは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

db_or()ソリューションは、ほとんどの条件をANDおよび1つまたはいくつかの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()。ANDされた5つの条件のうち、ORする必要がある条件が2つしかない場合にも機能します。その$query->where()ような場合、を使用する必要はありません。
キアムルノ

明確化のおかげで、その場合、それはどのように使用されますか?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()定義されていないメソッドに関するエラーを返します。
キアムルノ

わかったよ。説明をありがとう。私はそれが方法であるという印象を受けていました。それで、私の問題でもうまくいったでしょう。
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.