একাধিক মান সহ সত্তা ক্ষেত্র শর্তের সাথে একটি কোয়েরি করুন


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

যা ব্যর্থ হয় না, তবে উদ্দেশ্যযুক্ত ফলাফল সরবরাহ করে না। এটি প্রতিটি নোডের দুটি শব্দ বা দুটি শব্দ 8 প্রদর্শন করে । টার্ম 2 এবং টার্ম 8 এর পরিবর্তে intended নোডের সত্তা রেফারেন্স ক্ষেত্রে একাধিক নির্দিষ্ট মান রয়েছে কিনা তা যাচাই করে আমি কী এমন একটি কোয়েরি করব?

উত্তর:


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

মাঠে বা কোন বদ্বীপে কত পদ রয়েছে তা এটি কার্যকর করে।

সম্পাদন করা

এই এসকিউএল এর ফলাফল:

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')
Eyal

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], 'IN' বা [8], 'IN' এর মতো $ এবং শর্তগুলির মধ্যে একটির ব্যবহার করি তবে ফলাফলগুলি ঠিকঠাক প্রদর্শিত হয়, তবে যখন আমি উভয় ব্যবহার করি, আমি কোনও ফল পাই না। আমার কাছে দুটি নোড রয়েছে তা নিশ্চিত করার জন্য আমি ট্রিপল চেক করেছি।
ম্যাট

1
এটি সম্পর্কে চিন্তাভাবনা করে, অ্যান্ড কন্ডিশন গ্রুপের কোনও প্রয়োজন নেই কারণ এনটিটিকিওয়ারি ডিফল্টরূপে এবং ব্যবহার করে।
এয়াল

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,
  ];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.