【问题标题】:Doctrine two fields for the same entity, get related for both fields为同一个实体定义两个字段,使两个字段相关
【发布时间】:2017-04-29 14:47:02
【问题描述】:

我有 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 的数组

【问题讨论】:

  • 最后一个错误/结果是什么?
  • 它是空的,因为请求是:SELECT a0_.id AS id_0, a0_.route AS route_1, a0_.zip_code AS zip_code_2, a0_.city AS city_3 FROM address a0_ INNER JOIN reservation r1_ ON a0_。 id = r1_.pick_up_address_id INNER JOIN 保留 r2_ ON a0_.id = r2_.drop_off_address_id

标签: php symfony doctrine-orm orm


【解决方案1】:

我清除了我的缓存,添加了反转的注释:

 /**
 * @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');

它似乎有效

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2021-01-02
    相关资源
    最近更新 更多