"OR" Bedingung in db_select ()

51

Ich studiere die neue Datenbankebene und bin froh, dass sie in eine OOP-Ebene geändert wurde. Ich muss eine Abfrage mit implementieren db_select(). Ich habe festgestellt, dass ich eine WHEREAnweisung mit hinzufügen kann $query->condition(), aber die Bedingungen sind standardmäßig UND-verknüpft.

Wie kann ich die Bedingungen zusammen ODER?

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

Antworten:

81

Das ist nicht richtig, die Standardeinstellung ist AND. Um oder zu verwenden, müssen Sie Folgendes verwenden:

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

Die Hauptbedingungen für die Abfrage sind jedoch definitiv mit UND verknüpft.

Berdir
quelle
30

Sie können dies verwenden, um ODER zwischen 2 Bedingungen zu erstellen. Standardmäßig ist es UND

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

Es ist möglich, eine UND-Bedingung innerhalb von ODER zu haben. Angenommen, Sie haben 3 Bedingungen. Wenn Sie möchten, dass diese wie con1 UND con2 ODER con3 ist und in diesem Fall viele andere Fälle auftreten, können Sie db_und db_or verwenden, wenn Sie versuchen, db_or all zu verwenden Die Bedingungen innerhalb von db_or werden jetzt für den Fall benötigt, dass Sie möchten, und zwischen diesen können Sie db_ verwenden. Dies ist etwas mühsam, aber die Implementierung ist im folgenden Beispiel möglich

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

Auf diese Weise erhalten Sie eine Vorstellung davon, wie der Komplex und / oder die Bedingung in Drupal-PDO-Abfragen behandelt werden können.

umesh
quelle
22

Laut Drupal 7- Datenbankdokumentation lautet die Standardeinstellung AND- Bedingung. Wenn Sie jedoch OR- Bedingung verwenden möchten, verwenden Sie diese.

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

Einfaches Beispiel:

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

Standardmäßig gibt es eine AND-Bedingung, für die OR-Bedingung muss db_or () in die Bedingung eingefügt werden.

$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');
Bijaya Kumar Oli
quelle
0

Die Lösung db_or () funktioniert nicht, wenn Sie eine komplexe Abfrage erstellen, bei der die meisten Bedingungen mit UNDs und nur einer oder einigen ODER-Bedingungen verknüpft werden sollen.

Ich stieß auf einen Fall wie diesen, in dem ich bereits Bedingungen hatte und ich wollte nicht, dass sie OP-Bedingungen waren. Ich konnte die where () -Methode anstelle der Bedingung verwenden, um eine weitere Klausel hinzuzufügen, die ein OR enthielt. Hier ist ein Beispiel ähnlich der Abfrage, die ich dort gegen Ende mit der where-Methode verwendet habe:

$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();
tcm5025
quelle
Diese Antwort ist nicht korrekt: Funktioniert db_or()auch, wenn nur zwei Bedingungen von 5 Bedingungen, die UND-verknüpft sind, ODER-verknüpft werden müssen. Es ist nicht erforderlich $query->where(), für diesen Fall zu verwenden.
kiamlaluno
Vielen Dank für die Klarstellung, wie würde es dann in diesem Fall verwendet werden? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025
1
Sie müssen etwas Ähnliches wie verwenden db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); die resultierende Bedingung wäre $a AND $b AND ($c OR $d) AND $e. Ich benutze Pseudocode. db_or()ist eine Funktion, keine Methode; db_select()->condition()->db_or()würde einen Fehler über eine nicht definierte Methode zurückgeben.
kiamlaluno
Ok ich verstehe. Nochmals vielen Dank für die Erklärung. Ich hatte den Eindruck, es sei eine Methode. So hätte es auch bei meinem Problem geklappt.
tcm5025
0

Für Drupal 8 können Sie zB verwenden:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
Martin Klíma
quelle