Db_select () içindeki “OR” koşulu


51

Yeni veritabanı katmanını inceliyorum ve bir OOP katmanına değiştirildiği için memnunum. İle bir sorgu uygulamak gerekiyor db_select(). Bir WHEREdeyim ekleyebileceğimi öğrendim $query->condition(), ancak varsayılan olarak koşullar birlikte AND'ed.

Koşulları birlikte nasıl VEYA edebilirim?

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

Yanıtlar:


81

Bu doğru değil, varsayılan AND. Kullanmak için veya kullanmanız gerekir:

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

Ancak sorgudaki ana koşullar kesinlikle AND ile birleştirilir.


30

Bunu kullanabilirsiniz. VEYA 2 koşul arasında yapmak için ByDefault

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

VEYA içinde 3 koşul olduğunu varsayalım ve bunun con1 ve con2 VEYA con3 gibi olmasını istiyorsanız ve bu durumda diğer pek çok vakayı uyandırmak istiyorsanız db_ve db_or gibi kullanabilirsiniz çünkü db_or all db_or içindeki koşullar şimdi istemeniz durumunda ve db_and'ı kullanabileceğinizler arasında çok az sıkıcı olan ancak uygulanması mümkün olan durumlar arasında aşağıdaki örneğe bakınız.

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

Bu size Drupal PDO sorgularında karmaşık ve koşulların nasıl ele alınabileceği hakkında bir fikir verecektir.


22

Drupal 7 Database dokümantasyonuna göre varsayılan VE şartıdır, fakat OR şartını kullanmak istiyorsanız bunu kullanın ;

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

10

Basit örnek:

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

1

Varsayılan olarak VE koşulu vardır, VEYA koşulu içinde db_or () eklemeniz gerekir.

$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 () çözümü, koşulların çoğunun AND'ler ve yalnızca bir veya bazı OR koşullarıyla birleştirilmesini istediğiniz karmaşık bir sorgu oluşturduğunuzda işe yaramaz.

Daha önce şartlarım olduğu gibi bir davaya girdim ve onların VEYA koşulları olmasını istemedim. OR içeren başka bir cümle eklemek için koşul yerine where () yöntemini kullanabildim . İşte burada sonuna kadar olan burada where yöntemiyle kullandığım sorguya benzer bir örnek:

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

Bu cevap doğru değil: db_or()AND'lu olan 5 koşuldan YA DA gerekmesi gereken sadece iki koşul olduğunda da çalışır. $query->where()Böyle bir durumda kullanmak gerekmez .
kiamlaluno

Açıklama için teşekkürler, bu durumda nasıl kullanılır? db_select () -> condition () -> condition () -> db_or () -> condition () ??
tcm5025

1
Benzer bir şey kullanmanız gerekir db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); sonuçta ortaya çıkan durum olacaktır $a AND $b AND ($c OR $d) AND $e. Sahte kod kullanıyorum. db_or()bir fonksiyon değil, bir yöntemdir; db_select()->condition()->db_or()tanımlanmamış bir yöntemle ilgili bir hata döndürürdü.
kiamlaluno

Tamam anladım. Açıklama için tekrar teşekkürler. Bunun bir yöntem olduğu izlenimindeydim. Böylece benim sorunum için de işe yarayabilirdi.
tcm5025

0

Drupal 8 için örneğin kullanabilirsiniz:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.