Умова "АБО" у db_select ()


51

Я вивчаю новий шар бази даних, і я радий, що він змінений на рівень OOP. Мені потрібно реалізувати запит db_select(). Я виявив, що можу додати WHEREзаяву за допомогою $query->condition(), але за замовчуванням умови AND'ed разом.

Як я можу АБО умови разом?

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

Відповіді:


81

Це не правильно, за замовчуванням - І. Для використання або вам потрібно використовувати:

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

Але основні умови запиту, безумовно, приєднуються до AND.


30

Ви можете використовувати це для створення АБО між двома умовами 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();

Можна мати стан І в АБО, припустимо, у вас є 3 умови, і якщо ви хочете, щоб це було схоже на con1 І con2 АБО con3, а також у багатьох інших випадках у цьому випадку ви можете використовувати 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();

Це дасть вам уявлення про те, як складні та / або умови можна обробляти в запитах PDO на Drupal.


22

Відповідно до документації Drupal 7 Database за замовчуванням є умова AND , але якщо ви хочете використовувати умову АБО, використовуйте це;

$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, для умови АБО потрібно додати 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 і лише одна чи деякі умови АБО.

Я зіткнувся з таким випадком, коли в мене вже були умови, і я не хотів, щоб вони були АБО. Я зміг використати метод where () замість умови, щоб додати ще одне застереження, яке включало АБО. Ось приклад, подібний до запиту, який я використав із методом 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 умов, які є AND'ed. Для $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.