ইন্টিফিল্ডকিউরি অন্তর্ যোগদান করুন


21

আমি এন্টিফিল্ডকিউরি অবজেক্টটি ব্যবহার করে একটি ক্যোয়ারী চালাতে চাই। আমার নোড এবং নোড_একসেস টেবিল উভয়েরই থেকে মূল্য প্রয়োজন তাই আমার অভ্যন্তরীণ যোগদান করতে হবে। ডু ডকুমেন্টেশন থেকে আমি কীভাবে এটি সম্ভব তা বুঝতে পারি না।

আমার যা আছে তা এখানে -

$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();

1
যদিও এটি দ্রুপাল in-তে ফ্লাইটে করা যায় না, এটি দ্রুপাল ৮-এ করা যেতে পারে (এই লেখার সময় অসন্তুষ্ট)। সত্ত্বার ক্ষেত্র ক্যোয়ারী বিশদ (উদাহরণ সহ) এর জন্য সমর্থন পেতে সহায়তা দেখুন ।
কোলান

ড্রুপাল 8-তে সমস্ত শর্তগুলি (-> শর্ত ()) এর মতো। ডি 8-তে একটি ইএফকিউর পূর্বে: $ ফলাফল = \ দ্রুপাল :: অ্যান্টিকিউয়ারি ('নোড') -> শর্ত ('প্রকার', অ্যারে ('সত্তা_এ', 'সত্তা_ বি'), 'আইএন') -> শর্ত ('স্থিতি') , NODE_PUBLISHED) -> শর্ত ('Field_myfield.value', '5', '=') -> এক্সিকিউট (); Drupal এর 8 EFQ সালে collumn Drupal 7 field_name.value বা field_name.target_id দ্বারা নামের ক্ষেত্রটি সরাসরি সংজ্ঞায়িত করা হয়->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

উত্তর:


30

আপনি EntityFieldQueryসরাসরি যুক্ত হয়ে অতিরিক্ত যোগ যোগ করতে পারবেন না (এটি সমর্থিত নয়), hook_query_TAG_alter()যখন ক্যোয়ারীটি কোনও স্ট্যান্ডার্ড ডিবি ক্যোয়ারিতে রূপান্তরিত হয় তখন আপনি ক্যোয়ারিতে একটি ট্যাগ যুক্ত করতে পারেন, প্রয়োগ করতে পারেন এবং ম্যানুয়ালি জোড় যুক্ত করতে পারেন।

এটি পরীক্ষা করা হয়নি তবে সম্ভবত সেখানে বেশিরভাগ ক্ষেত্রে আপনাকে পাবেন:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'node_access')
  // etc
  ->addTag('MYTAG');

// get the query results as normal

এবং তারপরে ক্যোয়ারী ফাংশন পরিবর্তন করে:

function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
  $query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}

এটি করার অন্য উপায়টি EntityFieldQueryহ'ল নিজেই সাবক্লাস করা এবং যোগদান যোগ করা, তবে আমি মনে করি উপরোক্ত পদ্ধতিটি এই ক্ষেত্রে সহজ।


একক ফাংশনে এটি করার আরও ভাল উপায় আছে কি? তা না হলেওEntityFieldQuery
অ্যালান টমাস

2
সত্যই নয়, একমাত্র অন্য উপায় হ'ল ম্যানুয়ালি ব্যবহার করে ক্যোয়ারী তৈরি করা db_select, তারপরে আপনি যতটা চান নিয়ন্ত্রণ করতে পারেন
ক্লাইভ

আমি সঙ্গে যেতে হবে। থেক্স
অ্যালান টমাস

@ ক্লাইভ ... ওহ এই উত্তরটি সত্যিই আকর্ষণীয়। পছন্দ করি. : পি
টেনেন

2
@ মিচিয়েল নো EntityFieldQuery, কোনও ক্যাচিং করে না, এটি কেবল একটি চারপাশে আবৃত করে SelectQueryএবং সত্ত্বার জন্য কিছু পদ্ধতি যুক্ত করে। এই অতিরিক্ত পদ্ধতিগুলির জন্য আপনি সামান্য (খুব সামান্য) পারফরম্যান্স হ্রাস পেয়েছেন যা আপনি নিয়মিত ব্যবহারের বিপরীতে ব্যবহার করতে পেরেছেনSelectQuery
ক্লাইভ

3

আপনি যদি নিজের টেবিলগুলির সাথে কাস্টম বৈশিষ্ট্যগুলি ব্যবহার করেন তবে ট্যাগ পদ্ধতিটি কাজ করবে না। পরিবর্তে আপনাকে সাবকিউরি ব্যবহার করতে হবে:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');

$roles_subquery = db_select('users_roles', 'ur');
$roles_subquery->fields('ur', array('uid'));
$roles_subquery->condition('rid', $my_role_id);

$query->propertyCondition('uid', $roles_subquery, 'IN');

একটি এনটিটিফিল্ডকিউরিতে যোগদানের দরকার দেখুন , কীভাবে সাবকিউরি? বিস্তারিত জানার জন্য.


কাস্টম সারণী সহ আমার মতো মামলার জন্য দুর্দান্ত সমাধান। দুর্দান্ত কাজ!
ইগনাসিও সেগুরা পোস্টটিগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.