Условие «ИЛИ» в db_select ()


51

Я изучаю новый уровень базы данных и рад, что он изменился на уровень ООП. Мне нужно реализовать запрос с db_select(). Я обнаружил, что могу добавить WHEREзаявление с помощью $query->condition(), но по умолчанию условия объединены.

Как я могу ИЛИ условия вместе?

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

Ответы:


82

Это не правильно, по умолчанию используется AND. Чтобы использовать или, вам нужно использовать:

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

Но основные условия в запросе определенно связаны с AND.


30

Вы можете использовать это для создания ИЛИ между двумя условиями. По умолчанию это И

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

Можно иметь условие И в пределах ИЛИ, если у вас есть 3 условия, и если вы хотите, чтобы оно было похоже на con1 И con2 ИЛИ con3 и даже во многих других случаях, в этом случае вы можете использовать db_and, как db_or, потому что когда вы пытаетесь использовать db_or all условия внутри db_or теперь выполняются на тот случай, если вы хотите, и между теми, которые вы можете использовать db_, и это немного утомительно, но его можно реализовать, вот пример ниже

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

Это даст вам представление о том, как этот комплекс и / или условие могут обрабатываться в запросах Drupal PDO.


23

Согласно документации базы данных drupal 7, по умолчанию используется условие AND , но если вы хотите использовать условие OR, используйте это;

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

10

Простой пример:

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

1

По умолчанию есть условие AND, для условия OR необходимо добавить db_or () внутри условия.

$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

Решение db_or () не будет работать, когда вы создаете сложный запрос, в котором вы хотите, чтобы большинство условий были соединены с AND и только с одним или несколькими условиями OR.

Я столкнулся с таким случаем, когда у меня уже были условия, и я не хотел, чтобы они были ИЛИ условиями. Я смог использовать метод where () вместо условия, чтобы добавить еще одно предложение, содержащее OR. Вот пример, похожий на запрос, который я использовал с методом where в конце:

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

Этот ответ не верен: db_or()работает также, когда есть только два условия, которые необходимо «ИЛИ» из 5 условий, которые «И». Там нет необходимости использовать $query->where(), для такого случая.
kiamlaluno

Спасибо за разъяснения, как это будет использоваться в таком случае? db_select () -> условие () -> условие () -> db_or () -> условие () ??
tcm5025

1
Вам нужно использовать что-то похожее на db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); результирующее условие будет $a AND $b AND ($c OR $d) AND $e. Я использую псевдокод. db_or()это функция, а не метод; db_select()->condition()->db_or()вернул бы ошибку о методе, не определенном.
kiamlaluno

Хорошо, я понимаю. Еще раз спасибо за объяснение. У меня сложилось впечатление, что это был метод. Так что это также сработало бы для моей проблемы.
tcm5025

0

Для Drupal 8 вы можете использовать, например:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.