Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在没有“加入”的情况下获取加入原则;“真正的”;外键?_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

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
?你们的折扣班是什么样子的?您可能需要检查注释是否正确。不幸的是,它无法工作-它仍尝试创建外键