新しいデータベースレイヤーを研究していて、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 , '=');
//…
drupal 7 Database documentation によると、デフォルトは[〜#〜] and [〜# 〜]条件、ただし[〜#〜]または[〜#〜を使用する場合]条件はこれを使用します。
$db_or = db_or();
$db_or->condition('n.type', 'event', '=');
$db_or->condition('n.type', 'article', '=');
$query->condition($db_or);
不正解です。デフォルトはANDです。またはを使用するには、以下を使用する必要があります。
$or = db_or();
$or->condition();
$or->condition();
$query->condition($or);
ただし、クエリの主な条件は確実にANDで結合されます。
これを使用して、ORを2つの条件の間で作成できます。デフォルトでは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_andを使用できます。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クエリで複合体や条件を処理する方法がわかります。
簡単な例:
$nodes = db_select('node', 'n')
->fields('n')
->condition(
db_or()
->condition('uid', 1)
->condition('status', 0)
)
->execute()
->fetchAll();
デフォルトでは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');
ほとんどの条件をANDで結合し、1つまたはいくつかの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();
Drupal 8の場合、次のように使用できます。
// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);