我有2个实体,Reservation
,这是像Uber这样的乘车的预订。预订有一个字段pickUpAdress
和一个字段dropOffAdress
:
保留:
/**
* @AssertValid()
* @ORMManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER")
* @ORMJoinColumn(name="pick_up_address_id", referencedColumnName="id")
*/
protected $pickUpAddress;
/**
* @AssertValid()
* @ORMManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER")
* @ORMJoinColumn(name="drop_off_address_id", referencedColumnName="id")
*/
protected $dropOffAddress;
我在Adress
类中添加了这些注释:
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="Reservation",
* mappedBy="pickUpAddress",
* cascade={"all"})
*/
private $pickUpReservations;
/**
* @var ArrayCollection
* @ORMOneToMany(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选择(,以及我的家庭地址和我的办公室地址。
我有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
我清除了缓存,添加了注释的反转:
/**
* @AssertValid()
* @ORMManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER", inversedBy="pickUpReservations")
* @ORMJoinColumn(name="pick_up_address_id", referencedColumnName="id")
*/
protected $pickUpAddress;
/**
* @AssertValid()
* @ORMManyToOne(targetEntity="Address", cascade={"all"}, fetch="EAGER", inversedBy="dropOffReservations")
* @ORMJoinColumn(name="drop_off_address_id", referencedColumnName="id")
*/
protected $dropOffAddress;
并转换最后一个要使用的左JOIN:
return $qb->select('Address')
->leftjoin('Address.pickUpReservations', 'pickUpReservations')
->leftjoin('Address.dropOffReservations', 'dropOffReservations');
它似乎有效