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

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.


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.


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

10

Ejemplo simple:

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

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

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

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.