Warunek „OR” w db_select ()

51

Studiuję nową warstwę bazy danych i cieszę się, że została zmieniona na warstwę OOP. Muszę zaimplementować zapytanie za pomocą db_select(). Zauważyłem, że mogę dodać WHEREinstrukcję $query->condition(), ale domyślnie warunki są połączone AND.

Jak mogę LUB warunki razem?

$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 Mohamadi
źródło

Odpowiedzi:

81

To nie jest poprawne, domyślnie jest to AND. Aby użyć lub, musisz użyć:

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

Ale główne warunki zapytania są zdecydowanie połączone z AND.

Berdir
źródło
30

Możesz użyć tego Do tworzenia LUB między 2 warunkami ByDefault jest 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();

Możliwe jest posiadanie warunku AND w OR LUB założenie, że masz 3 warunki, a jeśli chcesz, aby było jak con1 AND con2 OR con3 i nawet wiele innych przypadków w tym przypadku możesz użyć db_ i jak db_or, ponieważ gdy próbujesz użyć db_or wszystkie warunki w db_or przyjmują teraz, jeśli chcesz, i pomiędzy tymi można użyć db_and, co jest trochę żmudne, ale możliwe jest jego wdrożenie, oto poniższy przykład

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

To da ci wyobrażenie o tym, jak kompleks i / lub warunki mogą być obsługiwane w zapytaniach Drupal PDO.

umesh
źródło
22

Zgodnie z dokumentacją bazy danych drupal 7 domyślnie jest to warunek ORAZ , ale jeśli chcesz użyć warunku LUB , użyj tego;

$db_or = db_or();
$db_or->condition('n.type', 'event', '=');
$db_or->condition('n.type', 'article', '=');
$query->condition($db_or);
zhilevan
źródło
10

Prosty przykład:

$nodes = db_select('node', 'n')
->fields('n')
->condition(
 db_or()
   ->condition('uid', 1)
   ->condition('status', 0)
 )
->execute()
->fetchAll();
Plazik
źródło
1

Domyślnie istnieje warunek AND, dla warunku OR należy dodać db_or () wewnątrz warunku.

$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
źródło
0

Rozwiązanie db_or () nie będzie działać, gdy budujesz złożone zapytanie, w którym chcesz połączyć większość warunków z AND i tylko jeden lub kilka warunków LUB.

Natrafiłem na taki przypadek, w którym miałem już warunki i nie chciałem, żeby były to warunki LUB. Byłem w stanie użyć metody where () zamiast warunku, aby dodać kolejną klauzulę zawierającą OR. Oto przykład podobny do zapytania, którego użyłem z metodą where tam pod koniec:

$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
źródło
Ta odpowiedź jest nieprawidłowa: db_or()działa również, gdy istnieją tylko dwa warunki, które wymagają OR'ed z 5 warunków AND'ed. W $query->where()takim przypadku nie trzeba używać .
kiamlaluno
Dzięki za wyjaśnienie, w jaki sposób miałoby to zostać wykorzystane w takim przypadku? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025,
1
Musisz użyć czegoś podobnego do db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); wynikałby warunek $a AND $b AND ($c OR $d) AND $e. Używam pseudokodu. db_or()jest funkcją, a nie metodą; db_select()->condition()->db_or()zwróci błąd dotyczący metody nie zdefiniowanej.
kiamlaluno
Ok, rozumiem. Jeszcze raz dziękuję za wyjaśnienie. Miałem wrażenie, że to metoda. To zadziałałoby również w przypadku mojego problemu.
tcm5025,
0

W przypadku Drupal 8 możesz użyć np .:

// 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
źródło