Condition "OU" dans db_select ()

51

J'étudie la nouvelle couche de base de données et je suis heureux qu'elle soit modifiée en couche OOP. J'ai besoin d'implémenter une requête avec db_select(). J'ai trouvé que je pouvais ajouter une WHEREdéclaration avec $query->condition(), mais par défaut, les conditions sont AND'ed ensemble.

Comment puis-je OU les conditions ensemble?

$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
la source

Réponses:

82

Ce n'est pas correct, la valeur par défaut est AND. Pour utiliser ou, vous devez utiliser:

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

Mais les conditions principales de la requête sont définitivement liées à AND.

Berdir
la source
30

Vous pouvez utiliser ceci Pour faire OU entre 2 conditions ByDefault c'est ET

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

Il est possible d'avoir une condition AND dans OU supposez que vous ayez 3 conditions et si vous voulez que ce soit comme con1 AND con2 OU con3 et même de nombreux autres cas, vous pouvez utiliser db_and et db_or, car lorsque vous essayez d'utiliser db_or all les conditions dans db_or prennent maintenant au cas où vous le voudriez et entre celles que vous pouvez utiliser db_and, ce qui est un peu fastidieux mais il est possible de le mettre en œuvre à l'exemple ci-dessous

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

Cela vous donnera une idée de la façon dont le complexe et / ou la condition peuvent être traités dans les requêtes Drupal PDO.

umesh
la source
23

Selon la documentation drupal 7 Database, la condition par défaut est AND , mais si vous souhaitez utiliser la condition OR , utilisez-la;

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

Exemple simple:

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

Par défaut, il existe une condition AND, car la condition OR doit ajouter db_or () à l'intérieur de la condition.

$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
la source
0

La solution db_or () ne fonctionne pas lorsque vous créez une requête complexe dans laquelle vous souhaitez que la plupart des conditions soient associées à des opérateurs AND et à une ou plusieurs conditions OR.

J'ai rencontré un cas comme celui-ci où j'avais déjà des conditions et je ne voulais pas qu'elles soient des conditions OU. J'ai pu utiliser la méthode where () à la place de la condition pour ajouter une autre clause incluant un OU. Voici un exemple similaire à la requête que j'ai utilisée avec la méthode where à la fin:

$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
la source
Cette réponse n'est pas correcte: db_or()fonctionne également lorsqu'il n'y a que deux conditions qui doivent être contrôlées OU sur cinq conditions traitées par AND. Il n'y a pas besoin d'utiliser $query->where(), pour un tel cas.
kiamlaluno
Merci pour la clarification, comment serait-il utilisé dans ce cas alors? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025
1
Vous devez utiliser quelque chose de similaire à db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); la condition résultante serait $a AND $b AND ($c OR $d) AND $e. J'utilise un pseudo-code. db_or()est une fonction, pas une méthode; db_select()->condition()->db_or()renverrait une erreur sur une méthode non définie.
kiamlaluno
Ok, je comprends. Merci encore pour l'explication. J'avais l'impression que c'était une méthode. Donc, cela aurait également fonctionné pour mon problème.
tcm5025
0

Pour Drupal 8, vous pouvez utiliser par exemple:

// 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
la source