"या db_select में स्थिति ()


51

मैं नई डेटाबेस परत का अध्ययन कर रहा हूं, और मुझे खुशी है कि इसे OOP परत में बदल दिया गया है। मुझे एक क्वेरी लागू करनी होगी db_select()। मैंने पाया कि मैं एक WHEREबयान जोड़ सकता हूं $query->condition(), लेकिन डिफ़ॉल्ट रूप से स्थितियां एक साथ हैं।

मैं शर्तों को एक साथ कैसे कर सकता हूं?

$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 शर्तों के बीच 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();

यह संभव है कि आपके पास 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();

इससे आपको अंदाजा हो जाएगा कि Drupal PDO प्रश्नों में कैसे जटिल और या स्थिति को संभाला जा सकता है।



10

सरल उदाहरण:

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

1

डिफ़ॉल्ट रूप से या शर्त के लिए, 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

Db_or () समाधान तब काम नहीं करेगा जब आप एक जटिल क्वेरी का निर्माण कर रहे हों, जहाँ आप चाहते हैं कि अधिकांश परिस्थितियाँ AND's के साथ संयोजित हों और सिर्फ एक या कुछ OR या स्थिति हो।

मैं इस तरह से एक मामले में भाग गया, जहां मेरे पास पहले से ही स्थितियां थीं, और मैं नहीं चाहता था कि वे OR की शर्तें हों। मैं जहां एक () शामिल करने के लिए शर्त के बजाय कहां () विधि का उपयोग करने में सक्षम था जिसमें एक OR शामिल था। यहाँ उस क्वेरी के समान एक उदाहरण दिया गया है जिसका उपयोग मैंने उस विधि के साथ किया है जहाँ अंत में:

$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 शर्तों में से OR'ed की आवश्यकता है जो 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.