db_select ()의“OR”조건


51

새 데이터베이스 계층을 연구 중이며 OOP 계층으로 변경되어 기쁩니다. 로 검색어를 구현해야합니다 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 , '=');
//…

답변:


81

정확하지 않습니다. 기본값은 AND입니다. 또는을 사용하려면 다음을 사용해야합니다.

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

그러나 쿼리의 주요 조건은 분명히 AND와 결합됩니다.


30

이 조건을 사용하여 2 가지 조건 사이에서 OR을 만들 수 있습니다.

$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 OR con3과 같고이 경우 많은 다른 경우를 원한다고 가정하면 AND 내에 AND 조건을 가질 수 있으며 db_or를 사용하려고 할 때 db_or와 같은 db_and를 사용할 수 있습니다 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();

이것은 Drupal PDO 쿼리에서 복합 및 조건을 처리 할 수있는 방법을 알려줍니다.


22

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

대부분의 조건을 AND 및 하나 또는 일부 OR 조건과 결합하려는 복잡한 쿼리를 작성하는 경우 db_or () 솔루션이 작동하지 않습니다.

나는 이미 조건이있는 이런 경우에 부딪 쳤고 OR 조건이되고 싶지 않았습니다. OR을 포함하는 다른 절을 추가하기 위해 조건 대신 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(). AND 인 5 가지 조건 중 OR해야하는 두 가지 조건 만있는 경우에도 작동합니다. $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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.