EntityFieldQuery'nin doğru kullanımı nedir?


37

Drupal 7'de, parametrenin node_load_multiple()kullanılmasını belirten API dokümantasyonu, $conditionskullanım lehine kaldırılmıştır EntityFieldQuery. Biri sınıfı kullanmak için bir düğüm kimlikleri listesi oluşturmak için nasıl kullanır node_load_multiple()? Bunun için başka kullanım davaları var mı?

Yanıtlar:


36

EntityFieldQuery, alanlar ve diğer düğüm özellikleri için çalışmak üzere Field SQL Storage gibi saha depolama modülleriyle arabirim oluşturmak için bir kanca seti kullanır. Uzun vadeli, EntityFieldQuery, herhangi bir varlık türünü sorgulamak için çok daha güvenilir bir yoldur ve bazı durumlarda bir örnek için çapraz varlık sorguları yapabilir (bkz. Field_has_data veya _list_values_in_use () .

Belirli bir zaman damgasından önce yayınlanan tüm düğümlerin bir listesini almak için EntityFieldQuery kullanmanın basit bir örneği:

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

Bu sorgunun $ sonuçları şöyle görünürdü:

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

Daha sonra bu diziyi node_load_multiple dizinine girdi olarak kullanabilirsiniz:

$nodes = node_load_multiple(array_keys($result['node']));

3
field_has_data, _list_values_in_use'den daha güzel bir örnek imo

15

Drupal'da örneklerin eklenmesiyle ilgili bir sorun buldum EntityFieldQuery. Bunu örnekler için kullanıyorum ve daha fazla örnek için görüşme fikrimi dile getirdim.

" Bir EntityFieldQuery örneğine ihtiyacımız var mı? "

Yorum # 11 arasında gösterileri kullanım node_load_multiple()aşağıda görüldüğü gibi:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

$nodes = entity_load('node', array_keys($entities['node']));
return node_view_multiple($nodes, 'teaser');

2
Dikkat, fieldOrderBy yöntemi, ilgili alanı boş bırakan tüm düğümleri dışarıda bırakır. Hangi kafa karıştırıcı çünkü bunun sadece sıralama yapması ve filtrelenmemesi gerekiyor (boş alanlı düğümlerin sonuç kümesinin üstünde veya altında olmasını beklersiniz). Daha fazla bilgi ve umarım bir düzeltme burada bulunabilir drupal.org/node/1611438 ve burada drupal.org/node/1662942
Mario Awad

9

İşte test modüllerinden birinden bir örnek:

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

Bu, vücut alanı "A" ile başlayan düğümleri seçer. Ayrıca iade edilen sonucun nasıl kullanılacağına dair EntityFieldQuery :: execute () işlevine de bakınız .

Birçok kullanım durumu vardır, tipik örnek, ilk örnekte gösterildiği gibi gövde alanı gibi belirli alan değeri için varlıkları sorgulamaktadır.

Avantaj, kullandığınız field_storage ne olursa olsun işe yaramasıdır. Örneğin, alanlarınızı MongoDB'de bulundurabilirsiniz ve field_data_body sorgulaması yapılırken EntityQuery hala çalışacaktır.


0

Veritabanını sorgulamak ve sonuçları benzer bir liste biçiminde almak için EntityFieldQuery sınıfını kullanabilirsiniz node_load_multiple().

Bu, bir sınıf oluşturarak, koşulları uygulayarak ve sorguyu uygulayarak gerçekleştirilebilir, örneğin:

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

Bu gibi diziyi üretecektir:

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

Sonuç diziden kimliğini edinmek için, kullanabilirsiniz: current(current($result))->tid.

İşte daha gelişmiş bir örnek:

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year . '%', 'like')
  ->fieldOrderBy('field_photo', 'fid', 'DESC')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // Run the query as user 1.

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
?>

Bakınız: Drupal.org'da EntityFieldQuery nasıl daha fazla açıklama için kullanılır.

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.