«Состояние» в db_select ()

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

Как я могу СОСТОЯТЬ условия?

$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 голос | спросил zhilevan 31 Mayam12 2012, 09:37:37

6 ответов


23

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

$db_or = db_or();
$db_or->condition('n.type', 'event', '=');
$db_or->condition('n.type', 'article', '=');
$query->condition($db_or);
ответил umesh 10 MonEurope/Moscow2012-12-10T14:35:21+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 14:35:21 +0400 2012, 14:35:21
80

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

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

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

ответил Berdir 31 Mayam12 2012, 09:43:28
31

Вы можете использовать это для создания ИЛИ между двумя условиями ByDefault: AND

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

Возможно, что у вас есть условие AND или предположим, что у вас есть 3 условия, и если вы хотите, чтобы это было похоже на con1 AND con2 OR con3 и evene во многих других случаях, в этом случае вы можете использовать db_and как db_or, потому что, когда вы пытаетесь используйте db_or, все условия в db_or берутся теперь, если вы хотите, и между теми, которые вы можете использовать db_and, что мало утомительно, но его можно реализовать, это пример ниже

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

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

ответил umesh 10 MonEurope/Moscow2012-12-10T14:35:21+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 14:35:21 +0400 2012, 14:35:21
8

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

$nodes = db_select('node', 'n')
->fields('n')
->condition(
 db_or()
   ->condition('uid', 1)
   ->condition('status', 0)
 )
->execute()
->fetchAll();
ответил Plazik 20 J000000Wednesday16 2016, 11:33:39
0

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

Я столкнулся с таким случаем, когда у меня были условия, и я не хотел, чтобы они были условиями ИЛИ. Я смог использовать метод 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();
ответил tcm5025 17 AM000000120000005331 2012, 00:17:53
0

По умолчанию существует условие И, для условия ИЛИ необходимо добавить 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');
ответил Bijaya Kumar Oli 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2016 13:49:34 +0300 2016, 13:49:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132