php 坚持时不设置外键值的原则

rdlzhqv9  于 2023-01-04  发布在  PHP
关注(0)|答案(1)|浏览(110)

我试图设置实体与学说,我坚持与这个错误:在持久化数据时,我遇到了一个关于非空约束违反的SQL错误。实际上,Doctrine生成了一个没有外键值的插入语句。

An exception occurred while executing 'INSERT INTO user_access_company (end_at, created_at, updated_at, user_id, company_id) VALUES (?, ?, ?, ?, ?)' with params [null, "2022-12-12 23:06:57+0000", "2022-12-12 23:06:57+0000", null, 82]:  SQLSTATE[23502]: Not null violation: 7 ERROR:  null value in column "user_id" violates not-null constraint

这些是我的实体

class Participant implements ParticipantInterface
{
    protected $id;

    protected $source;
    protected $identifier;
    protected $firstName;
    protected $lastName;
    protected $emailAddress;
    protected $createdAt;
    protected $updatedAt;
}

class UserAccessCompany
{
    private Participant $user;
    private Company $company;
    private ?\DateTimeImmutable $endAt;
    private \DateTimeImmutable $createdAt;
    private \DateTimeImmutable $updatedAt;
}

以及相关的XMLMap
一个二个一个一个
我使用类似下面的简单代码来插入数据:

$userAccessCompany = new UserAccessCompany($user, $company, $endAt);
$this->getEntityManager()->persist($userAccessCompany);
$this->getEntityManager()->flush();

$user$company是已经持久化在数据库中的实体,如果我转储$user->identifier,里面有一个值。然而,生成的SQL语句是这样的:INSERT INTO user_access_company (end_at, created_at, updated_at, user_id, company_id) VALUES (null, "2022-12-12 23:06:57+0000", "2022-12-12 23:06:57+0000", null, 82),因此缺少user_id
company实体的声明类似(没有指定inversedBy/mappedBy),并且当我生成迁移时,在userAccessCompany.user_id上的之间有一个外键引用participant.identifier,因此doctrine似乎知道这种关系
还有一些额外的注意事项,我简化了实体以使它们在这里可读,我在所有实体中都定义了getter和setter。我还尝试使用注解Map,但没有成功,我在userAccessCompany中添加了一个id字段,并删除了user/company上的主键
作为参考,我使用Symfony 4.4和doctrine/orm 2.7.3

jc3wubiy

jc3wubiy1#

这是一个已知的理论限制,我在文档中忽略了这一点。
https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

联接-具有非主键的列

无法使用指向非主键的联接列。Doctrine将认为这些是主键,并使用数据创建延迟加载代理,这可能会导致意外结果。Doctrine可能会出于性能原因而不在运行时验证此设置的正确性,而只能通过“验证架构”命令进行验证。

相关问题