如何在没有"真实"的情况下获取Doctrine中的连接外键?

时间:2014-07-12 10:01:56

标签: mysql symfony doctrine-orm

我需要" connet" HolidayPackageDiscount的实例(一对一),并且能够在从存储库获取数据时获取连接。即:

 // Inside a method of HolidayPackageRepository repository class
 $qb = $this->createQueryBuilder($alias = 'hp');
 $qb->leftJoin("$alias.discount", 'd')
    ->addSelect('d'); // fetch join

问题discount 表被删除并每隔几小时再次填充,因此discount_id不能是真正的外键。但是标识符可能保持不变:

/**
 * @ORM\Entity()
 * @ORM\Table("holiday_package")
 */
class HolidayPackage
{
    /**
     * @ORM\Column(name="discount_id", type="integer", nullable=true)
     *
     * @var null|Discount
     */
    private $discount;
}

如何在没有真正的外键的情况下获取连接?

2 个答案:

答案 0 :(得分:1)

我从未真正尝试过,但根据文档,从2.4开始,只要两个实体都被映射,就可以在任意列上连接实体,使用“通常”JOIN ... WITH语法:

SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email

但是,我不确定它是否允许您在上面的示例中实际获取加入“黑名单”,或者它只允许您限制结果。

答案 1 :(得分:0)

即使您的数据库上没有外键,也可以指定实体的关系

/**
 * @ORM\Entity()
 * @ORM\Table("holiday_package")
 */
class HolidayPackage
{
    /**
     * @ORM\Column(name="discount_id", type="integer", nullable=true)
     *
     * @var null|int
     */
    private $discountId;


    /**
     * @ORM\OneToOne(targetEntity="Discount")
     * @ORM\JoinColumn(name="discount_id", referencedColumnName="discount_id")
     *
     * @var null|Discount
     */
    private $discount;
}

这样你的加入就可以了。