«Состояние» в 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 , '=');
//…
6 ответов
Согласно drupal 7 документации по базам данных по умолчанию используется условие И , но если вы хотите использовать условие ИЛИ , то используйте это:
$db_or = db_or();
$db_or->condition('n.type', 'event', '=');
$db_or->condition('n.type', 'article', '=');
$query->condition($db_or);
Это неверно, по умолчанию используется значение AND. Чтобы использовать или, вам нужно использовать:
$or = db_or();
$or->condition();
$or->condition();
$query->condition($or);
Но основные условия запроса, безусловно, связаны с AND.
Вы можете использовать это для создания ИЛИ между двумя условиями 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.
Простой пример:
$nodes = db_select('node', 'n')
->fields('n')
->condition(
db_or()
->condition('uid', 1)
->condition('status', 0)
)
->execute()
->fetchAll();
Решение 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();
По умолчанию существует условие И, для условия ИЛИ необходимо добавить 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');