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

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.


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.


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

10

Einfaches Beispiel:

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

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');

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

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.