学说两个字段的同一实体,都与两个字段相关



我有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');

它似乎有效

最新更新