कई मूल्यों के साथ एक इकाई क्षेत्र की स्थिति के साथ एक क्वेरी करें


14

मेरे पास एक सामग्री प्रकार है जिसमें एक इकाई संदर्भ क्षेत्र है जो उपयोगकर्ताओं को उस क्षेत्र में कई वर्गीकरण शब्द जोड़ने की अनुमति देता है। मैं उन प्रश्नों को करने का प्रयास कर रहा हूं, जो नोड्स को पकड़ते हैं, जिनके पास उस क्षेत्र के भीतर टैक्सोनॉमी शर्तों का एक विशिष्ट सेट है।

उस क्षेत्र में एक मान का उपयोग करना ठीक काम करता है, जैसे।

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', 2)
        ->sort('field_last_name', DESC);

जहाँ 2 मैं जिस शब्द की खोज कर रहा हूँ, उसका आईडी है। हालाँकि जब मैं नोड्स की खोज करने का प्रयास करता हूँ जिसमें दो विशिष्ट शब्द होते हैं जैसे,

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8])
        ->sort('field_last_name', DESC);

मुझे त्रुटि प्राप्त है

अमान्य पैरामीटर संख्या: बाध्य चर की संख्या टोकन की संख्या से मेल नहीं खाती:

मैंने भी प्रयास किया है

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8], 'IN')
        ->sort('field_last_name', DESC);

जो विफल नहीं है, लेकिन इच्छित परिणाम प्रदान नहीं करता है। यह प्रत्येक नोड को प्रदर्शित करता है जिसमें या तो टर्म 2 या टर्म है। टर्म 2 के बजाय टर्म 8 और टर्म 8। यदि कोई नोड एक इकाई संदर्भ क्षेत्र में कई विशिष्ट मान रखता है तो मैं एक क्वेरी कैसे करूंगा?

जवाबों:


19

दो अलग-अलग उपयोग करें andConditionGroup():

$query = \Drupal::entityQuery('node')
  ->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type');
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 2);
$query->condition($and);
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 8);
$query->condition($and);
$result = $query->execute();

इससे कोई फर्क नहीं पड़ता कि क्षेत्र में कितने पद हैं या वे किस डेल्टा में हैं।

संपादित करें

इस SQL ​​में यह परिणाम है:

SELECT base_table.vid AS vid, base_table.nid AS nid
FROM 
{node} base_table
INNER JOIN {node_field_data} node_field_data ON node_field_data.nid = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy ON node__custom_taxonomy.entity_id = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy_2 ON node__custom_taxonomy_2.entity_id = base_table.nid
WHERE  (node_field_data.status = '1') AND (node_field_data.type = 'custom_type') AND( (node__custom_taxonomy.custom_taxonomy_target_id = '2') )AND( (node__custom_taxonomy_2.custom_taxonomy_target_id = '8') )

उन्होंने ऊपर एक समतुल्य कोड की कोशिश की और यह कोई मान नहीं लौटा, क्या आपने जाँच की कि यह कोड काम करता है?
ईयाल

हां, यह कई लेखों से भरे मानक लेख और टैग फ़ील्ड के लिए काम करता है।
4k4

शायद मेरे सुझाव विफल हो गया क्योंकि मैंने लिखा यह इतना चाहते $and->condition('custom_taxonomy', [2], 'IN'),$and->condition('custom_taxonomy', [8], 'IN')
ईयाल

3
इससे कोई फर्क नहीं पड़ता, बस इसका परीक्षण किया है, इसके साथ 'IN'भी काम करता है। क्या फर्क पड़ता है दो अलग-अलग और समूह हैं।
4k4

3
अच्छा, यह काम नहीं करता था। समझ में आता है, क्योंकि यह कई आंतरिक रूप से जुड़ता है।
बेरादिर

8

आपके द्वारा पूछे गए जटिल प्रश्नों को करने के लिए, आपको एक शर्त समूह का उपयोग करना होगा और डेल्टा को क्वेरी करना होगा।

$query = \Drupal::entityQuery('node');
$query->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type')
  ->condition('custom_taxonomy', [2, 8], 'IN')
  ->condition('custom_taxonomy.%delta', 2, '=')
  ->sort('field_last_name', DESC);
$or = $query->orConditionGroup();
$or->condition('custom_taxonomy.0.target_id', 2);
$or->condition('custom_taxonomy.0.target_id', 8);
$query->condition($or);

QueryInterface :: हालत प्रलेखन देखें ।


1
मैंने उत्तर लागू किया, लेकिन किसी कारण से यह उचित परिणाम प्रदर्शित नहीं कर रहा है। यदि मैं $ 2 और शर्तों में से केवल एक का उपयोग करता हूं, जैसे कि [2], 'IN' या [8], 'IN' तो यह परिणाम ठीक दिखाता है, लेकिन जब मैं दोनों का उपयोग करता हूं, तो मुझे कोई परिणाम नहीं मिलता है। मैंने यह सुनिश्चित करने के लिए ट्रिपल चेक किया कि मेरे पास दोनों नोड्स हैं।
मैट

1
इसके बारे में सोचते हुए, AND स्थिति समूह के लिए कोई आवश्यकता नहीं है क्योंकि UnitQuery का उपयोग करता है और डिफ़ॉल्ट रूप से।
इल

1
ठीक है, मैंने इसे केवल $ क्वेरी-> स्थिति () का उपयोग करके बदल दिया है, लेकिन मुझे अभी भी समस्या है कि दोनों का उपयोग करते समय यह कोई परिणाम प्रदर्शित नहीं करता है।
मैट

1
के अनुसार QueryInterface :: हालत प्रलेखन आप मुहाने पर शर्तें लागू कर सकते हैं। मैं एक उदाहरण कोड के साथ उत्तर को अपडेट करूंगा।
इल

1
@ यह, और शर्त समूह बेमानी लगता है, लेकिन यह वास्तव में एक ही क्षेत्र के लिए कई शर्तों को निर्दिष्ट करने में मदद करता है। आपको केवल प्रत्येक शर्त को एक अलग और समूह में रखना होगा।
4k4

1
$taxonomy_term = 'taxonomy_term';
    $vid = 'name_taxon';
    $terms = $this->entity_type_manager->getStorage($taxonomy_term)
      ->loadTree($vid);

foreach ($terms as $term) {
  $term_data[] = [
    "vid" => $term->vid,
    "name" => $term->name,
  ];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.