Ben bir varlık ile bir çok-bir ilişkisi olan bir Car
varlık var Owner
. Ben bütün arabalar seçerseniz, Doktrin Car
masada bir sorgu ve Owner
masaya sonradan bir sorgu yapar for each car. Yani N araba getiriliyor N olur yerine 1 sorguları tek bir Car
ve Owner
tablolar arasında JOIN sorgusu.
Şöyle Benim varlıklardır:
/** @Entity */
class Car {
/** @Id @Column(type="smallint") */
private $id;
/** @ManyToOne(targetEntity="Owner", fetch="EAGER")
@JoinColumn(name="owner", referencedColumnName="id") */
private $owner;
public function getId() { return $this->id; }
public function getOwner() { return $this->owner; }
}
/** @Entity */
class Owner {
/** @Id @Column(type="smallint") */
private $id;
/** @Column(type="string") */
private $name;
public function getName() { return $this->name; }
}
Ben onların sahipleri ile araba listelemek istiyorsanız, yapın:
$repo = $em->getRepository('Car');
$cars = $repo->findAll();
foreach($cars as $car)
echo 'Car no. ' . $car->getId() .
' owned by ' . $car->getOwner()->getName() . '\n';
Şimdi bu tüm ayrı Doktrin her araç için bir sorgu verdiği gerçeğinden, çok iyi çalışıyor.
SELECT * FROM Car;
SELECT * FROM Owner WHERE id = 1;
SELECT * FROM Owner WHERE id = 2;
SELECT * FROM Owner WHERE id = 3;
....
Tabii ki benim sorgu günlük bu gibi bakmak isterdim:
SELECT * FROM Car JOIN Owner ON Car.owner = Owner.id;
I fetch="EAGER"
ya da fetch="LAZY"
önemli değil, ve ben iki taraf arasında JOIN ile özel bir DQL sorgu yapmak bile, $car->getOwner()
hala Doktrin neden olup olmadığını (I $repo->findAll()
hepsi neden bu durumda, İSTEKLİ kullandığınız sürece) veritabanını sorgulamak.
Ben burada sadece çok yorgunum ve bu işe gerekiyordu yoludur - ya da bunun yerine JOIN sorgusu yapmak için Doktrini zorlamak için akıllı bir yolu var mı?