Mysql 如何在没有“加入”的情况下获取加入原则;“真正的”;外键?
我需要将Mysql 如何在没有“加入”的情况下获取加入原则;“真正的”;外键?,mysql,symfony,doctrine-orm,Mysql,Symfony,Doctrine Orm,我需要将HolidayPackage的实例“连接”到Discount(一对一),并能够在从存储库获取数据时获取join。即: // Inside a method of HolidayPackageRepository repository class $qb = $this->createQueryBuilder($alias = 'hp'); $qb->leftJoin("$alias.discount", 'd') ->addSelect('d'); //
HolidayPackage
的实例“连接”到Discount
(一对一),并能够在从存储库获取数据时获取join。即:
// Inside a method of HolidayPackageRepository repository class
$qb = $this->createQueryBuilder($alias = 'hp');
$qb->leftJoin("$alias.discount", 'd')
->addSelect('d'); // fetch join
问题是折扣表每隔两个小时就被删除并重新填充一次,因此折扣id
不能是真正的外键。但是,标识符可能保持不变:
/**
* @ORM\Entity()
* @ORM\Table("holiday_package")
*/
class HolidayPackage
{
/**
* @ORM\Column(name="discount_id", type="integer", nullable=true)
*
* @var null|Discount
*/
private $discount;
}
如果没有真正的外键,如何获取联接?即使数据库中没有外键,也可以在实体上指定关系
/**
* @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;
}
这样你的连接就可以工作。我从来没有尝试过,但是根据文档,从2.4开始,只要两个实体都被映射,就可以在任意列上连接实体,并使用“常用”连接。。。使用语法:
SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email
但是,我不确定它是否允许您在上面的示例中实际获取join“Blacklist”,或者只允许您限制结果。您可能只需要进行第二次查询或下拉到sql。@Cerad这是我目前正在做的,我正在寻找更好的方法…@gremo我不同意。它指定的关系不是外键。它允许进行联接,即使未定义外键,在SQL中也可以进行联接。您正在定义一个“标准”列discount\u id
,然后定义一对一关系,该关系将创建相同的列discount\u id
。如果我是对的,一对一关系拥有目标实体,因此它持有外键。它可能会工作(我没有测试过),但是如果切换注释的顺序会怎么样?这也行吗?顺便说一句,我在考虑另一种方法:使用标准外键,但在更新/同步过程中禁用它们,防止级联删除子项。你觉得怎么样?我试过你的方法,但没用。Symfony profiler给出了一个映射错误:关联折扣#holiday#包引用了所有者方字段HolidayPackage#折扣,该字段未定义为关联,而是定义为字段。@gremo错误似乎在折扣类上。折扣上的id真的被称为Discount\u id
还是仅仅是id
?你们的折扣班是什么样子的?您可能需要检查注释是否正确。不幸的是,它无法工作-它仍尝试创建外键