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

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.


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.


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

10

Exemple simple:

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

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

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

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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.