我需要" connet" HolidayPackage
到Discount
的实例(一对一),并且能够在从存储库获取数据时获取连接。即:
// 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;
}
如何在没有真正的外键的情况下获取连接?
答案 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;
}
这样你的加入就可以了。