INNERINFERQuery INNER BERGABUNG

21

Saya ingin menjalankan kueri menggunakan objek EntityFieldQuery. Saya butuh nilai dari tabel node dan node_access karena itu saya harus menggunakan INNER JOIN. Dari dokumentasi do, saya tidak tahu bagaimana ini mungkin.

Inilah yang saya miliki -

$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();
Allan Thomas
sumber
1
Meskipun tidak dapat dilakukan sambil jalan di Drupal 7, itu dapat dilakukan di Drupal 8 (belum dirilis pada saat penulisan ini). Lihat kueri Entity Field mendapat dukungan bergabung untuk detail (termasuk contoh).
colan
Dalam Drupal 8 semua kondisi adalah Seperti itu (-> kondisi ()). Contoh EFQ dalam D8: $ result = \ Drupal :: entityQuery ('node') -> kondisi ('type', array ('entity_a', 'entity_b'), 'IN') -> condition ('status' , NODE_PUBLISHED) -> condition ('field_myfield.value', '5', '=') -> execute (); Di Drupal 8 EFQ kolom didefinisikan langsung di bidang nama oleh field_name.value atau field_name.target_id di drupal 7 is->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

Jawaban:

30

Anda tidak dapat menambahkan gabungan tambahan EntityFieldQuerysecara langsung (tidak didukung), tetapi Anda dapat menambahkan tag ke kueri, menerapkan hook_query_TAG_alter(), dan menambahkan gabungan secara manual saat kueri dikonversi ke kueri db standar.

Ini tidak diuji tetapi mungkin akan membawa Anda ke sana:

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

// get the query results as normal

Dan kemudian query mengubah fungsi:

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

Cara lain untuk melakukannya adalah dengan subklas EntityFieldQueryitu sendiri dan menambahkan bergabung, tapi saya pikir metode di atas lebih sederhana dalam hal ini.

Clive
sumber
Apakah ada cara yang lebih baik untuk melakukannya dalam satu fungsi? Bahkan jika tidakEntityFieldQuery
Allan Thomas
2
Tidak juga, satu-satunya cara lain adalah membangun kueri menggunakan secara manual db_select, maka Anda dapat memiliki kontrol sebanyak yang Anda inginkan
Clive
Saya akan pergi dengan itu. Thx
Allan Thomas
@Clive ... oh jawaban ini sangat menarik. Suka itu. : P
tenken
2
@Michiel No EntityFieldQuerytidak melakukan caching apa pun, ia hanya membungkus SelectQuerydan menambahkan beberapa metode untuk entitas. Metode-metode tambahan tersebut menjelaskan sedikit (sangat sedikit) penurunan kinerja yang Anda alami menggunakannya sebagai lawan dari yang biasaSelectQuery
Clive
3

Jika Anda menggunakan properti khusus dengan tabel Anda sendiri, metode tag tidak akan berfungsi. Anda harus menggunakan subquery sebagai gantinya:

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

Lihat Butuh gabung di EntityFieldQuery, bagaimana dengan subquery? untuk detail.

colan
sumber
Solusi sempurna untuk kasus-kasus seperti milik saya, dengan tabel khusus. Kerja luar biasa!
Ignacio Segura Postigo