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.