14/05/2017 - DOCTRINE, SYMFONY
Bu örneğimizde aralarında ilişki olmayan iki entity için bir tane doctrine query builder yazacağız. İlişki yerine, tabloların biri diğerinin primary key bilgisini barındıracak. Örneğimiz teknik olarak one-to-many (Order->Product) ilişkidir ama biz ORM ilişkisini eklemeyeceğiz.
/**
* @ORM\Entity
* @ORM\Table(name="order")
*/
class Order
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
....
}
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="order_id", nullable=true, type="integer")
*/
private $orderId;
....
}
class OrderRepository extends EntityRepository
{
public function findOneByIdAndAllItsProducts($orderId)
{
return $this->createQueryBuilder('or')
->select('or, pr')
->join('MyShopBundle:Product', 'pr', 'WITH', 'pr.orderId = or.id')
->where('or.id = :id')
->setParameter('id', $orderId)
->getQuery()
->getResult();
}
}
class OrderService
{
....
public function getOne($orderId)
{
$result = $this->orderRepository->findOneByIdAndAllItsProducts($orderId);
if (!$result) {
// Throw an exception
}
// Index 0 is always the Order object and the rest are Product objects
$orderEntity = $result[0];
unset($result[0]);
foreach ($result as $item) {
echo get_class($item).PHP_EOL; // This will always be the Product object
}
}
....
}