এন্টিফিল্ডকিউরি বনাম ডিবি_সিলিট ()


19

আমি যখন ডাবিলিলেক্ট () দিয়ে মানটি আনতে একই কাজ করতে পারি তখন কেন আমাকে অ্যান্টিফিল্ডকিউরি ব্যবহার করা উচিত ?

কেউ কেবল একটি লিঙ্ক নয়, উদাহরণ সরবরাহ করতে পারলে ভাল হয়।

উত্তর:


11

আমি মনে করি বিন্দুটি হ'ল বাক্য গঠনটি আরও সহজ, এবং কোডটি আরও বোধগম্য হবে।

উদাহরণস্বরূপ, আপনি যদি এমন ধরণের নোডগুলি চান যেখানে মান সহ 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();

14

আমি মনে করি যে প্রধান কারণ prefering EntityFieldQueryউপর db_selectআপনি নিম্ন স্তরের কাঠামো সম্পর্কে জানা আছে না যে, অন্য কথায় রয়েছে: কিভাবে কাপড় ডাটাবেসের মধ্যে সংরক্ষণ করা হয়। এটি আলগা সংযোগের উন্নতি করে ।


6
এটি সঠিক, যদিও এটি আরও বেশি এগিয়ে যায়। ক্ষেত্রের সঞ্চয়স্থান প্লাগযোগ্য। ডিফল্ট বাস্তবায়ন ক্ষেত্রের জন্য ডেটাবেজে ক্ষেত্রের জন্য পৃথক সারণীতে ডেটা সঞ্চয় করে তবে এটি প্রতিস্থাপন করা যেতে পারে, উদাহরণস্বরূপ এমন একটি বাস্তবায়ন রয়েছে যা মঙ্গোডিবিতে ক্ষেত্রের ডেটা সংরক্ষণ করতে দেয়। আপনি যদি চান যে আপনার কোডটি পোর্টেবল হতে পারে এবং কেবলমাত্র আপনার নির্দিষ্ট সাইট কনফিগারেশনে কাজ না করে, আপনাকে অবশ্যই এন্টিফিল্ডকুরি ব্যবহার করতে হবে।
বার্ডির

3

এন্টিফিল্ডকিউরি (ইএফকিউ) কেবল সত্তা আইডি ফিরিয়ে দেবে। আপনি যদি সত্তাগুলির ডেটা অ্যাক্সেস করতে চান, আপনাকে কল করতে হবে 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()এখানে কিভাবে সহায়তা করে তা দেখতে ব্যর্থ হয়েছি । আপনাকে এখনও সত্তাটি লোড করতে হবে।
ফ্ল্যাভিওভস

1

এন্টিফিল্ডকিউরির তুলনায় অনেক বেশি সীমাবদ্ধ db_select()তাই আপনার ব্যবহারযোগ্য না হওয়ার db_select()(যুক্ত বার্ট উত্তর দেখুন) সঠিক কারণ থাকতে হবে যা যথেষ্ট পঠনযোগ্য এবং আরও নমনীয়।

উদাহরণস্বরূপ, ক্ষেত্রগুলি আনতে অভ্যন্তরীণ জোইনentityFieldQuery ব্যবহার করুন । যদি কোনও কারণে আপনার বাম জোইনের দরকার হয় তবে আপনি আটকে গেছেন ... http://drupal.org/node/1226622


ঠিক আছে, আমি জানতে চাই কেন আমার আনসারটিতে "-1" ছিল। হ্যাঁ, অ্যান্টিফিল্ডকিউরিটি সুন্দর, তবে খুব সুন্দর, শক্তিশালী এবং সম্পূর্ণ এপিআই হ'ল ডিবি_লেক্টের চেয়ে কম দক্ষ ... আমি আমার কোড থেকে আমার অনেকটা ফিল্ডকিউরি সরিয়েছি কারণ এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে খুব সীমিত ছিল, মনে হয় এটি অবশ্যই প্রাপ্য ছিল চিহ্নিত করা. যাই হোক।
yann_yinn

1
আমি মনে করি কেউ কেউ আপনার উত্তর পছন্দ করেন না কারণ এটি হ'ল স্বীকৃতি দিতে ব্যর্থ হয় যে কীভাবে আলাদা আলাদা স্টোরেজ পদ্ধতির উপরে অ্যান্টিফিল্ডক্যুরি একটি বিমূর্ত স্তর, যা দুর্দান্ত বৈশিষ্ট্য। আমি প্রচুর সাইটগুলিতে কাজ করি যেখানে আমরা এটি জানি যে, বলুন, মাইএসকিউএল সর্বদা x / y / z এর ডাটাবেস হয়ে থাকবে এবং আমাদের যখন প্রয়োজন হবে তখন আমরা লিনার ডিবি কোয়েরিগুলিও লিখতে পছন্দ করি। আমি অ্যান্টিফিল্ডকোয়ারিকে ডিবি_সিলিটের চেয়ে কোনও সুন্দর হিসাবে খুঁজে পাই না to পৃষ্ঠার শীর্ষে থাকা 2 তুলনা প্রায় দৃশ্যত অভিন্ন।
চার্লি শ্লিয়েসার

হ্যাঁ, সে কারণেই আমি "বার্ট উত্তর দেখুন" লিখেছি। এই বিশেষ ব্যবহারের ক্ষেত্রে বাদে, db_select আরও কার্যকর এবং অনেক বেশি নমনীয় হবে।
yann_yinn

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