web-dev-qa-db-fra.com

Condition "OU" dans db_select ()

J'étudie la nouvelle couche de base de données et je suis heureux qu'elle soit remplacée par une couche OOP. J'ai besoin d'implémenter une requête avec db_select(). J'ai trouvé que je peux ajouter un WHERE instruction avec $query->condition(), mais par défaut les conditions sont ET ensemble.

Comment puis-je OR 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 , '=');
//…
51
Yusef

Selon drupal 7 Documentation de la base de données la valeur par défaut est [~ # ~] et [~ # ~] condition, mais si vous souhaitez utiliser [~ # ~] ou [~ # ~] condition puis utilisez ceci;

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

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

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

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

82
Berdir

Vous pouvez l'utiliser pour faire OR 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 OR supposons que vous ayez 3 conditions et si vous voulez que ce soit comme con1 AND con2 OR con3 et même de nombreux autres cas) dans ce cas, vous pouvez utiliser db_and comme db_or parce que lorsque vous essayez d'utiliser db_or toutes les conditions dans db_or prennent maintenant au cas où vous le souhaitez et entre celles-ci, vous pouvez utiliser db_and qui est peu fastidieux mais il est possible de le mettre en œuvre 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 gérés dans Drupal PDO queries.

30
umesh

Exemple simple:

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

Par défaut, il existe une condition ET, pour OR la condition 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');
1
Bijaya Kumar Oli

La solution db_or () ne fonctionnera pas lorsque vous générez une requête complexe dans laquelle vous souhaitez que la plupart des conditions soient conjuguées avec des ET et seulement une ou certaines OR condition (s)).

J'ai rencontré un cas comme celui-ci où j'avais déjà des conditions, et je ne voulais pas qu'elles soient OR conditions. J'ai pu utiliser la méthode where () = au lieu de 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 près de 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();
0
tcm5025

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);
0
Martin Klíma