![](/img/trans.png)
[英]Dealing with two oneToOne fields on Doctrine entity pointing on the same related entity
[英]Doctrine two fields for the same entity, get related for both fields
我有2个实体, Reservation
是对Uber这样的游乐设施的预订。 预订具有字段pickUpAdress
和字段dropOffAdress
:
保留:
/**
* @Assert\Valid()
* @ORM\ManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER")
* @ORM\JoinColumn(name="pick_up_address_id", referencedColumnName="id")
*/
protected $pickUpAddress;
/**
* @Assert\Valid()
* @ORM\ManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER")
* @ORM\JoinColumn(name="drop_off_address_id", referencedColumnName="id")
*/
protected $dropOffAddress;
我在Adress
类中添加了这些注释:
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Reservation",
* mappedBy="pickUpAddress",
* cascade={"all"})
*/
private $pickUpReservations;
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Reservation",
* mappedBy="dropOffAddress",
* cascade={"all"})
*/
private $dropOffReservations;
和我的形式:
->add(
'pickUpAddress',
EntityType::class,
array(
'class' => Address::class,
'property' => 'display',
'label' => 'pick_up_address',
'translation_domain' => 'front',
'empty_value' => 'new_address',
'query_builder' => function (AddressRepository $addressRepository) {
return $addressRepository->getAdressesByUser($this->user);
},
'required' => false
)
我希望在新预订的表单中显示预先为给定用户选择的所有地址的列表。
例如:如果我预定接送地址的家庭地址和派送地址的办公室地址, 对于我的下一次预订,我希望两个选择(html选择)分别带有我的家庭地址和我的办公室地址,分别用于dropOffAdress和pickUpAdress字段。
我有这个SQL:
SELECT * FROM `address`
JOIN reservation
on reservation.pick_up_address_id = address.id
OR reservation.drop_off_address_id = address.id
我只需要添加where
子句以仅选择一个已登录用户,但这不是这里的问题。 我无法使用查询生成器进行联接。 我尝试了很多组合,例如:
$qb->select('pick_up_address', 'drop_off_adress')
->from(Reservation::class, 'reservations')
->join('reservations.pickUpAddress', 'pick_up_address')
->join('reservations.dropOffAddress', 'drop_off_adress')
$qb->select('Address')
->from(Address::class, 'Address')
->join('Address.pickUpReservations', 'pick_up_reservations')
->join('Address.dropOffReservations', 'drop_off_reservations')
但这行不通。 如果我使用DQL,它确实可以工作(我的存储库向我提供了结果),但是表单生成器需要一个queryBuilder对象,而不是Adress
数组
我清除了缓存,添加了与注释相反的内容:
/**
* @Assert\Valid()
* @ORM\ManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER", inversedBy="pickUpReservations")
* @ORM\JoinColumn(name="pick_up_address_id", referencedColumnName="id")
*/
protected $pickUpAddress;
/**
* @Assert\Valid()
* @ORM\ManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER", inversedBy="dropOffReservations")
* @ORM\JoinColumn(name="drop_off_address_id", referencedColumnName="id")
*/
protected $dropOffAddress;
并转换最后一个以使用左连接:
return $qb->select('Address')
->leftjoin('Address.pickUpReservations', 'pickUpReservations')
->leftjoin('Address.dropOffReservations', 'dropOffReservations');
它似乎有效
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.