2011-09-02 12 views
11

Tuhaf davranışı alıyorum Sorguda setMaxResults'u çağırdığımda, gerçek değerin ne olduğu önemli değil, max sayısını "2" olarak görmek ister gibi görünüyor. Ben setMaxResults satırını açıklama yaparken

function findMostRecentByOwnerUser(\Entities\User $user, $limit) 
{ 
    echo "2: $limit<br>"; 
    $query = $this->getEntityManager()->createQuery(' 
     SELECT t 
     FROM Entities\Thread t 
     JOIN t.messages m 
     JOIN t.group g 
     WHERE 
      g.ownerUser = :owner_user 
     ORDER BY m.timestamp DESC 
    '); 
    $query->setParameter("owner_user", $user); 
    $query->setMaxResults(4); 
    echo $query->getSQL()."<br>"; 
    $results = $query->getResult(); 
    echo "3: ".count($results); 
    return $results; 
} 

, ben 6 sonuçlar elde ederler. Onu bıraktığımda en son 2 sonucu elde ederim. Oluşturulan SQL kodunu phpMyAdmin'de çalıştırdığımda en yeni 4 sonucu elde ederim. oluşturulan SQL, başvuru için şöyledir:

SELECT <lots of columns, all from t0_> 
FROM Thread t0_ 
INNER JOIN Message m1_ ON t0_.id = m1_.thread_id 
INNER JOIN Groups g2_ ON t0_.group_id = g2_.id 
WHERE g2_.ownerUser_id = ? 
ORDER BY m1_.timestamp DESC 
LIMIT 4 

Düzenleme:

the DQL "Limit" documentation okurken, ben rastladım şu: En sorgu fetch- içeriyor

ise Sonuç sınırlama yöntemlerini belirterek koleksiyona katılmayı beklediğiniz gibi çalışmıyor. Max Sonuçlarını Ayarla veritabanı sonuç satırlarının sayısını kısıtlar, ancak getirilen birleştirilmiş koleksiyonlar söz konusu olduğunda, bir kök öğe birçok satırda görünebilir ve belirtilen sonuç sayısından daha az bir şekilde nemlendirilebilir.

Getirdiğim koleksiyona sahip olmadığımdan eminim. Getirilen bir koleksiyonun SELECT t, m FROM Threads JOIN t.messages gibi bir şey yaptığım yer olduğu izleniminin altındayım. Bunu anlamamda yanlış mıyım?

+0

Sadece doktrin 2.2 ile aynı sorunu fark ettim. Bunun için bir çözüm olmadığına şaşıyorum ... – Gregoire

cevap

10

bir güncelleme: Doktrin ile ->groupBy('your_entity.id') sorunu çözmek gibi görünüyor kullanarak paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

+1

Her nasılsa bunu işe asla alamıyorum (daha önce hatırladım ama şimdi işe yaramayacağını hatırlıyorum). Geçen hafta indirilen Symfony ve /var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php bana sürüm 2.3.0 olduğunu söyler. Kullandığım setMaxResults değeri ne olursa olsun 2143 sayımı ($ paginator). – HMR

1

Aynı sorunu yalnızca ana tablonun içeriğini getirerek ve Varlık'ta tanımlanan fetch="EAGER" olarak getirilen tüm birleştirilen tablolara sahip olarak çözdüm (burada http://www.doctrine-project.org/docs/orm/2.1/en/reference/annotations-reference.html?highlight=eager#manytoone'da açıklanmıştır).

class VehicleRepository extends EntityRepository 
{ 
    /** 
    * @var integer 
    */ 
    protected $pageSize = 10; 

    public function page($number = 1) 
    { 
     return $this->_em->createQuery('SELECT v FROM Entities\VehicleManagement\Vehicles v') 
      ->setMaxResults(100) 
      ->setFirstResult($number - 1) 
      ->getResult(); 
    } 
} 

Örnek repo'mda, doğru sonuç miktarını elde etmek için yalnızca araç tablasını getirdiğimi görebilirsiniz. Ancak, tüm özellikler (marka, model, kategori gibi) hemen getirilir.

class Vehicles 
{ 
    ... 

    /** 
    * @ManyToOne(targetEntity="Makes", fetch="EAGER") 
    * @var Makes 
    */ 
    public $make; 

    ... 
} 

: Burada

(. Ben Varlık bir dizi olarak temsil gerekli çünkü ben de Varlık-içindekiler iterated, ama bu mesele afaik olmamalı)

benim varlıktan bir alıntı numaralı önemli her Varlığı doğru şekilde eşlediğinizden, aksi takdirde çalışmaz.

5

kullanabilirsiniz 2.2+!

+0

Sadece bunu denedim. Başlangıçta işe yaramış görünüyordu ama sonuçların getirilen tablolardaki sonuçları sınırlandırıyor gibi görünüyor. –

İlgili konular