EntityFieldQuery INNER KATIL


21

EntityFieldQuery nesnesini kullanarak bir sorgu çalıştırmak istiyorum. Hem düğüm hem de node_access tablodan değer gerekir, bu nedenle INNER JOIN kullanmanız gerekir. Do dökümantasyonundan bunun nasıl mümkün olduğunu anlayamıyorum.

İşte sahip olduğum şey -

$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
Drupal 7'de anında gerçekleştirilemese de, Drupal 8'de (bu yazı sırasında yayınlanmamış) yapılabilir. Ayrıntılar için bkz. Varlık Alanı sorgusu birleştirme desteği aldı (bir örnek dahil).
colan

Drupal 8'de tüm koşullar şöyledir (-> koşul ()). D8'deki bir EFQ'dan: $ sonuç = \ Drupal :: entityQuery ('düğüm') -> koşul ('tür', dizi ('varlık_a', 'varlık_b'), 'IN') -> koşul ('durum' , NODE_PUBLISHED) -> koşul ('field_myfield.value', '5', '=') -> execute (); Drupal 8 EFQ'da collumn doğrudan ad alanında field_name.value veya field_name.target_id ile drupal 7'de tanımlanır->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

Yanıtlar:


30

EntityFieldQueryDoğrudan bir ek birleştirme ekleyemezsiniz (desteklenmez), ancak sorguya bir etiket ekleyebilir, uygulayabilir hook_query_TAG_alter()ve sorgu standart bir db sorgusuna dönüştürüldüğünde birleştirmeyi el ile ekleyebilirsiniz.

Bu test edilmedi, ancak muhtemelen sizi oraya götürecektir:

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

// get the query results as normal

Ve sonra sorgu değiştirme işlevi:

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

Bunu yapmanın diğer yolu, EntityFieldQuerykendini alt sınıf haline getirmek ve birleştirme eklemek olacaktır, ancak yukarıdaki yöntem bu durumda daha basit olduğunu düşünüyorum.


Tek bir işlevle yapmanın daha iyi bir yolu var mı? Olmasa bileEntityFieldQuery
Allan Thomas

2
Gerçekten değil, tek başka yol kullanarak sorguyu manuel olarak oluşturmak db_select, o zaman üzerinde istediğiniz kadar kontrol sahibi olabilir
Clive

Ben buna devam edeceğim. Teşekkürler
Allan Thomas

@Clive ... oh bu cevap gerçekten ilginç. Beğendim. : P
tenken

2
@Michiel No EntityFieldQueryhiçbir önbellekleme yapmaz, sadece a'yı sarar SelectQueryve varlıklar için bazı yöntemler ekler. Bu ekstra yöntemler, normalin aksine kullanarak karşılaşacağınız hafif (çok hafif) performans düşüşünü SelectQuery
açıklar

3

Kendi tablolarınızla özel özellikler kullanıyorsanız, etiket yöntemi çalışmaz. Bunun yerine alt sorgular kullanmanız gerekir:

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

Bkz Bir nasıl bir alt sorgu hakkında bir EntityFieldQuery katılmak gerekiyor? detaylar için.


Özel masaları olan benimki gibi durumlar için mükemmel çözüm. Mükemmel iş!
Ignacio Segura Postigo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.