Ben bir PHP web uygulaması üzerinde çalışıyorum, ve ORM işlevsellik için Doktrini 2.0 kullanmayı umuyorum. Ancak, sorgunun belirli bir tip önemli sorun yaşıyorum.
Foo ve Bar varlıkları içeren basit bir etki alanı modeli düşünün. Bir Foo Varlık birçok Barlar içeren, ve bir Bar etkin olarak işaretlenmiş olabilir.
/** @Entity */
class Foo
{
/** @OneToMany(targetEntity="Bar", mappedBy="foo") */
protected $bars;
/** Returns Bars marked as active. */
public function getActiveBars()
{
// XXX What goes here?
}
}
/** @Entity */
class Bar
{
/** @ManyToOne(targetEntity="Foo", inversedBy="bar") */
protected $foo;
/** @Column(type="boolean") */
protected $active;
/** ...setter omitted for clarity... */
}
My question is: what code should be placed in the getActiveBars
yöntemi? Strong>
Aşağıdaki kod düzgün çalışır, ancak veritabanında birçok inaktif Bar nesneler olduğunda performans sorunu olacaktır. Bar koleksiyon üzerinde yineleme yapılacak veritabanı karşı büyük bir sorgu neden olur.
function getActiveBars()
{
$ret = array();
foreach($this->bars as $bar) {
if ($bar->isActive()) $ret[] = $bar;
}
return $ret;
}
Böyle SELECT b FROM Bar l WHERE b.active = true AND b.foo = :foo
getActiveBar içinde () gibi bir DQL sorgu yürütülürken DQL karşı yürütülen bu yana ancak böyle bir sorgu (() denir EntityManager'a # floş önce yapılan Bar herhangi önemli değişiklikler tespit olmaz, çözüm gibi görünüyor veritabanı).