我试图设置实体与学说,我坚持与这个错误:在持久化数据时,我遇到了一个关于非空约束违反的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
1条答案
按热度按时间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可能会出于性能原因而不在运行时验证此设置的正确性,而只能通过“验证架构”命令进行验证。