Condición "OR" en db_select ()

51

Estoy estudiando la nueva capa de base de datos y me alegra que se haya cambiado a una capa OOP. Necesito implementar una consulta con db_select(). Descubrí que puedo agregar una WHEREdeclaración con $query->condition(), pero de forma predeterminada las condiciones son AND 'juntas.

¿Cómo puedo O las condiciones juntas?

$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
fuente

Respuestas:

82

Eso no es correcto, el valor predeterminado es AND. Para usar o, debes usar:

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

Pero las condiciones principales en la consulta definitivamente se unen con AND.

Berdir
fuente
30

Puede usar esto para hacer O entre 2 condiciones Por defecto es Y

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

Es posible tener la condición AND dentro de O suponga que tiene 3 condiciones y si desea que sea como con1 Y con2 O con3 y muchos otros casos en este caso, puede usar db_y como db_or porque cuando está tratando de usar db_or all las condiciones dentro de db_or toma ahora en caso de que desee y entre las que puede usar db_y eso es un poco tedioso pero es posible implementarlo aquí está el ejemplo a continuación

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

Esto le dará una idea de cómo se puede manejar el complejo o la condición en las consultas Drupal PDO.

umesh
fuente
23

De acuerdo con la documentación de la base de datos de drupal 7 , el valor predeterminado es la condición AND , pero si desea usar la condición OR , use esto;

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

Ejemplo simple:

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

Por defecto hay una condición AND, para la condición OR necesita agregar db_or () dentro de la condición.

$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
fuente
0

La solución db_or () no funcionará cuando esté creando una consulta compleja donde desee que la mayoría de las condiciones se unan con AND y solo una o algunas condiciones OR.

Me encontré con un caso como este donde ya tenía condiciones, y no quería que fueran condiciones OR. Pude usar el método where () en lugar de la condición para agregar otra cláusula que incluía un OR. Aquí hay un ejemplo similar a la consulta que utilicé con el método where cerca del final:

$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
fuente
Esta respuesta no es correcta: db_or()funciona también cuando solo hay dos condiciones que necesitan OR 'de 5 condiciones que son AND'. No es necesario usar $query->where(), para tal caso.
kiamlaluno
Gracias por la aclaración, ¿cómo se usaría en ese caso entonces? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025
1
Necesitas usar algo similar a db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); la condición resultante sería $a AND $b AND ($c OR $d) AND $e. Estoy usando pseudocódigo. db_or()es una función, no un método; db_select()->condition()->db_or()devolvería un error sobre un método no definido.
kiamlaluno
Ok, lo entiendo. Gracias de nuevo por la explicación. Tenía la impresión de que era un método. Entonces también habría funcionado para mi problema.
tcm5025
0

Para Drupal 8 puede usar, por ejemplo:

// 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
fuente