EntityFieldQuery ile yalnızca bazı alanlar alınsın mı?


19

Drupal 7, EntityFieldQuery ile çok umut verici ORM benzeri sorgulama sistemine sahiptir.

Şu anda, düğüm seçimini nasıl yapacağımı anlıyorum, ancak sonuç, aradığım gibi belirli herhangi bir bilgi içermiyor.

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

Bu nedenle, yalnızca bir alanın değerlerini almak istiyorsak, örneğin geçerli alandaki 'field_date' gibi tüm düğüm verilerini yüklememiz gerekir.

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

Alanların değerini almanın bir yolu varsa, bunun yerine bellekte aşırı yüklenmeye neden olduğu için tüm düğümlerin tam verilerini yüklemek.

$nodesFieldDates = ???

Yanıtlar:


10

Harika bir soru!

EntityFieldQuery gerçekten iyi şeyler, ama eğer gerçekten ciddi olmak istiyorsanız, sınıfı özel bir modülde geçersiz kılmanız ve orada yapmanız gereken her türlü davranışı eklemeniz gerekir.

Tam niyetinizi bilmiyorum, ama kendimi geçmişte konuyla ilgili bu makaleye yönlendirdim . Bu iyi yazılmış yazı için Neil Hastings'e teşekkür ederiz.

Güzel overiding örnekleri için makalede biraz kod örnekleri arayın.

Umarım yardımcı olur, mutlu kodlama!


Tamam anladım ! Bu nedenle, muhtemelen, sonuç alanlarını değiştirmek için "EntityFieldQuery" "buildQuery" yöntemini yeniden tanımlamak mümkündür. Muhtemelen, bu işe yarayabilir.
Fedir RYKHTIK

11

Bunun cevabını buldum! Apache Solr modülü , EntityFieldQuery sınıfını genişletmek için genişletir . AddExtraField adlı yeni bir yöntem ekler.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$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')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Apache Solr kurulu değilse, o sınıfı genişletmek için kodu kopyalamanız yeterlidir.


Apache Solr modülünün bazı dezavantajları olduğu için bunun için bir sanal alan oluşturuldu drupal.org/sandbox/mikeytown2/2209909
mikeytown2

2
Bu yanıtı mikeytown2 tarafından oluşturulmuş (şuan sandbox) modülü için seçti (teşekkürler!)
Oliver Coleman

Yanıttaki bağlantı işe yaramıyor gibi görünüyor. "Devam etmeden önce oturum açmanız veya kaydolmanız gerekiyor" yazıyor.
mbomb007

@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Bağlantı güncellendi
mikeytown2


0

Hala bir EFQ'dan Alan almak isteyen herkes EFQ Ekstra Alanlar modülüne bakar .

Uyarı: Bu modül, veritabanınızdan veri döndürmek için EntityFieldQuery'yi kötüye kullanır. Varlıklar veya üzerinde kurulu olan herhangi bir modülle çalışmaz.

AddField öğesini bir EntityFieldQueryExtraFields nesnesi içinde kullanmanızı sağlar (EntityFieldQuery nesnelerini genişletir). Başlangıçta EntityFieldQuery yalnızca varlık kimliği, paket ve varlık türünü size geri verir. Bu modül, ekstra varlık_yükleri yapmadan üzerine bir katman daha ekler! Çok miktarda veri ile çalışmak ve sql sorgularını azaltmak istiyorsanız önemlidir. EFQ zaten bu bilgiler için veritabanını sorguladığından, neden bazı ek alanlar vermek için bu sorguyu değiştirmeyesiniz? Bu, verileri elde etmek için tek bir ekstra sorgu yapılmayacağı anlamına gelir.

Varlık_yüklemesi veya benzer işlevlerde meydana gelen bazı biçimlendirme sonrası / yüklemeye güveniyorsanız, bu modül bununla ilgilenmeyecektir. Alınan verilerin kendinizin geçerliliğini sağlamanız gerekir.

Misal

Düğüm başlığını getirme

$ query = new EntityFieldQueryExtraFields ();
  $ sonuç = $ sorgu-> entityCondition ('entity_type', 'düğüm')
  -> propertyCondition ('tür', 'my_bundle_type')
  -> propertyCondition ('durum', 1)
  -> addExtraField ('field_myfield', değer ', değer')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'başlık', 'başlık', 'düğüm')
  -> fieldCondition ('field_myfield', 'değer', 'some_value_to_filter_on', '=')
  ->) (uygulanır;
Olası kombinasyonlar:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

alan adı
Ek alanın hangi alandan gelmesi gerektiğini belirtin. Temel tablodan geliyorsa, boş bırakın ve tablo bağımsız değişkenini doldurun

kolon
Sütunun adını belirtin,

column_alias
Sütunun takma adını belirtin,

tablo
İsteğe bağlı olarak, buraya düğüm veya kullanıcı gibi bir şey ekleyin (temel tablo),

Hem bu modülü (EFQ Ekstra Alanlar) hem de (şu anda sandbox) modülünü mikeytown2 ile denedim ve ikincisi çok daha iyi görünüyordu (daha hoş, daha mantıklı çıktı) ve aynı zamanda eskisinden çok daha iyi korunuyor gibi görünüyor. mikeytown2 sandbox modülü drupal.org/sandbox/mikeytown2/2209909 adresindedir .
Oliver Coleman
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.