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.