Condizione "OR" in db_select ()


51

Sto studiando il nuovo livello di database e sono contento che sia cambiato in un livello OOP. Devo implementare una query con db_select(). Ho scoperto che posso aggiungere WHEREun'istruzione con $query->condition(), ma per impostazione predefinita le condizioni sono AND insieme.

Come posso OR le condizioni insieme?

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

Risposte:


82

Non è corretto, il valore predefinito è AND. Per utilizzare o, è necessario utilizzare:

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

Ma le condizioni principali sulla query sono sicuramente associate a AND.


30

Puoi usarlo Per creare OR tra 2 condizioni ByDefault è 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();

È possibile avere una condizione AND all'interno di OR supponiamo che tu abbia 3 condizioni e se vuoi che sia come con1 AND con2 OR con3 ed eviti molti altri casi in questo caso puoi usare db_and come db_or perché quando stai cercando di usare db_or all le condizioni all'interno di db_or prendono ora nel caso tu voglia e tra quelle puoi usare db_and che è un po 'noioso ma è possibile implementarlo ecco l'esempio qui sotto

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

Questo ti darà un'idea di come gestire il complesso e / o la condizione nelle query Drupal DOP.


23

Secondo drupal 7 Document database la condizione predefinita è AND , ma se si desidera utilizzare la condizione OR , utilizzare questa;

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

10

Esempio semplice:

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

1

Per impostazione predefinita è presente la condizione AND, per la condizione OR è necessario aggiungere db_or () all'interno della condizione.

$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

La soluzione db_or () non funzionerà quando si crea una query complessa in cui si desidera che la maggior parte delle condizioni sia congiunta con AND e solo una o alcune condizioni OR.

Mi sono imbattuto in un caso come questo in cui avevo già delle condizioni e non volevo che fossero condizioni OR. Sono stato in grado di utilizzare il metodo where () anziché la condizione per aggiungere un'altra clausola che includesse un OR. Ecco un esempio simile alla query che ho usato con il metodo where vicino alla fine:

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

Questa risposta non è corretta: db_or()funziona anche quando ci sono solo due condizioni che devono essere OR su 5 condizioni che sono AND. Non è necessario utilizzare $query->where(), in tal caso.
kiamlaluno

Grazie per il chiarimento, come verrebbe utilizzato in quel caso? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025

1
Devi usare qualcosa di simile a db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); la condizione risultante sarebbe $a AND $b AND ($c OR $d) AND $e. Sto usando lo pseudo-codice. db_or()è una funzione, non un metodo; db_select()->condition()->db_or()restituirebbe un errore relativo a un metodo non definito.
kiamlaluno

Ok ho capito. Grazie ancora per la spiegazione. Avevo l'impressione che fosse un metodo. Quindi avrebbe funzionato anche per il mio problema.
tcm5025

0

Per Drupal 8 puoi usare ad esempio:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.