web-gelistirme-sc.com

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

Drupal 7 içinde, node_load_multiple() için API dokümantasyonu, $conditions Parametresinin EntityFieldQuery kullanılması lehine kullanımdan kaldırıldığını belirtir. biri node_load_multiple() ile kullanmak üzere düğüm kimlikleri listesi oluşturmak için sınıfı kullanır.

37
user7

EntityFieldQuery, alanlar ve diğer düğüm özelliklerinde çalışmak için Field SQL Storage gibi alan depolama modülleriyle arabirim oluşturmak için bir dizi kanca kullanır. Uzun vadeli, EntityFieldQuery herhangi bir varlık türünü sorgulamanın çok daha güvenilir bir yoludur ve bazı durumlarda çapraz varlık sorguları gerçekleştirebilir (bkz. field_has_data veya _ list_values_in_use () misal.

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 sorgudan $ sonuç şu şekilde görünür:

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 giriş olarak kullanabilirsiniz:

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

Drupal EntityFieldQuery.

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

yorum no. 11 , aşağıda görüldüğü gibi node_load_multiple() kullanımını gösterir:

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

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, döndürülen sonucun nasıl kullanılacağı hakkında EntityFieldQuery :: execute () konusuna bakın.

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

Avantajı, kullanmak istediğiniz field_storage'ın çalışmasıdır. Örneğin, MongoDB'deki alanlarınızın çalışmasını sağlayabilirsiniz ve EntityQuery, field_data_body'yi manuel olarak sorgulamazken çalışmaya devam eder.

8
Berdir

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

Bu, bir sınıf oluşturarak, koşulları uygulayarak ve sorguyu yürüterek 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, diziyi aşağıdaki gibi ü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',
    )),
  ),
)

Kimliği sonuç dizisinden getirmek için şunları kullanabilirsiniz: current(current($result))->tid.

İşte daha gelişmiş ö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);
}
?>

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

0
kenorb