আমি যখন ডাবিলিলেক্ট () দিয়ে মানটি আনতে একই কাজ করতে পারি তখন কেন আমাকে অ্যান্টিফিল্ডকিউরি ব্যবহার করা উচিত ?
কেউ কেবল একটি লিঙ্ক নয়, উদাহরণ সরবরাহ করতে পারলে ভাল হয়।
আমি যখন ডাবিলিলেক্ট () দিয়ে মানটি আনতে একই কাজ করতে পারি তখন কেন আমাকে অ্যান্টিফিল্ডকিউরি ব্যবহার করা উচিত ?
কেউ কেবল একটি লিঙ্ক নয়, উদাহরণ সরবরাহ করতে পারলে ভাল হয়।
উত্তর:
আমি মনে করি বিন্দুটি হ'ল বাক্য গঠনটি আরও সহজ, এবং কোডটি আরও বোধগম্য হবে।
উদাহরণস্বরূপ, আপনি যদি এমন ধরণের নোডগুলি চান যেখানে মান সহ my_type
একটি ক্ষেত্রের নাম থাকে, ডিবি_সিলিটের সাথে, ইউওল এমন কিছু করুন:field_foo
$val
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
এন্টিফিল্ডকিউরির সাথে যা অনেক সহজ:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
আমি মনে করি যে প্রধান কারণ prefering EntityFieldQuery
উপর db_select
আপনি নিম্ন স্তরের কাঠামো সম্পর্কে জানা আছে না যে, অন্য কথায় রয়েছে: কিভাবে কাপড় ডাটাবেসের মধ্যে সংরক্ষণ করা হয়। এটি আলগা সংযোগের উন্নতি করে ।
এন্টিফিল্ডকিউরি (ইএফকিউ) কেবল সত্তা আইডি ফিরিয়ে দেবে। আপনি যদি সত্তাগুলির ডেটা অ্যাক্সেস করতে চান, আপনাকে কল করতে হবে entity_load()
, যা, ডেটা লোড করার সাথে সাথে, এটি নিশ্চিত করবে যে আপনি অন্তর্নিহিত সমস্ত জিনিস যা সাধারণত যত্ন নেন না (যেমন ক্ষেত্রগুলি লোড করা, অন্যান্য মডিউল হুক কল করা ইত্যাদি) তৈরি হয়েছে made । অবশ্যই, দুটি এসকিউএল ক্যোয়ারী এবং প্রচুর ওভারহেডের ফলস্বরূপ , তবে এটি বিমূর্ততার জন্য মূল্য দিতে হবে।
EFQ সিনট্যাক্সটি আরও স্পষ্ট হিসাবে, আমি মনে করি এটি ব্যক্তিগত পছন্দগুলির একটি অনেক বেশি প্রশ্ন। উদাহরণস্বরূপ, আমি মনে করি না যে EFQ আরও পরিষ্কার। লক্ষ্য করুন যে db_select()
EFQ এর সাথে একটি কার্যকারী প্রতিস্থাপনের ক্ষেত্রে অবশ্যই রিটার্ন মান পরীক্ষা এবং পরবর্তী entity_load()
কল অন্তর্ভুক্ত থাকতে হবে এবং এটি কোডটিতে প্রচুর শব্দ যোগ করে, আইএমএইচও:
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
if (!empty($entities['node'])) {
$nodes = entity_load('node', array_keys($entities['node']));
} else {
$nodes = array();
}
সুতরাং, আপনার প্রশ্নের উত্তর: আপনার সত্তা পূর্ণ বৈশিষ্ট্যযুক্ত (যেমন ক্ষেত্রযোগ্য, অন্যান্য মডিউল ইত্যাদি ব্যবহার করতে পারেন) এবং EFQ ব্যবহার করুন এবং আপনি মনে করেন যে এর বাক্য গঠনটি আরও পরিষ্কার। অন্য ক্ষেত্রে, ব্যবহার করতে পারে db_select()
।
entity_metadata_wrapper()
এখানে কিভাবে সহায়তা করে তা দেখতে ব্যর্থ হয়েছি । আপনাকে এখনও সত্তাটি লোড করতে হবে।
এন্টিফিল্ডকিউরির তুলনায় অনেক বেশি সীমাবদ্ধ db_select()
তাই আপনার ব্যবহারযোগ্য না হওয়ার db_select()
(যুক্ত বার্ট উত্তর দেখুন) সঠিক কারণ থাকতে হবে যা যথেষ্ট পঠনযোগ্য এবং আরও নমনীয়।
উদাহরণস্বরূপ, ক্ষেত্রগুলি আনতে অভ্যন্তরীণ জোইনentityFieldQuery
ব্যবহার করুন । যদি কোনও কারণে আপনার বাম জোইনের দরকার হয় তবে আপনি আটকে গেছেন ...
http://drupal.org/node/1226622