Php 自动生成复合主键的一个字段的原则

Php 自动生成复合主键的一个字段的原则,php,mysql,symfony,doctrine-orm,doctrine,Php,Mysql,Symfony,Doctrine Orm,Doctrine,我目前有一个表,它的主键是由id+外键组成的复合值。id是自动递增的,外键引用另一个表 在保存数据时,我只知道外键值,我希望id作为一个自动递增的数字从数据库返回给我 我了解到,doctrine不支持自动生成复合主键的id,因此可以通过doctrine做些什么来保存数据,并且仍然在复合键的一部分上具有自动增量 请注意,在提交这个问题之前,我已经研究了其他几个问题,比如:我还多次阅读了条令的文档,看看我是否遗漏了什么 主要问题是关于学说 Every entity with a composite

我目前有一个表,它的主键是由id+外键组成的复合值。id是自动递增的,外键引用另一个表

在保存数据时,我只知道外键值,我希望id作为一个自动递增的数字从数据库返回给我

我了解到,doctrine不支持自动生成复合主键的id,因此可以通过doctrine做些什么来保存数据,并且仍然在复合键的一部分上具有自动增量

请注意,在提交这个问题之前,我已经研究了其他几个问题,比如:我还多次阅读了条令的文档,看看我是否遗漏了什么

主要问题是关于学说

Every entity with a composite key cannot use an id generator other than
“ASSIGNED”. That means the ID fields have to have their values set before
you call EntityManager#persist($entity).
为了帮助解决这个问题,下面是一个如何构造表的示例:

create table composite_example (
    id int(11) not null auto_increment,
    fk_id int(11) not null,
    a_prop varchar(20),
    primary key (id, fk_id)
) engine=InnoDB default charset=utf8;
如果我必须手动构造一个MySQL查询,在知道fk_id和a_prop的值的情况下插入到这个表中,我可以做:

insert into composite_example (fk_id, a_prop) values (999, 'a_value');
它将在表上创建一个id值正确的行


我怎样才能对教义做出同样的行为?有人知道完成工作的方法或解决方法吗?

这件事没有简单的解决方案,但这里有几个选项:

1) 您可以删除复合密钥并将UUID用作密钥。这不是一个简单的解决方案,因为它会影响需要更改的代码数量、迁移所需的时间以及迁移对性能的影响

2) 另一种选择是条令社区建议的,也可以用于其他ORM:使用序列器。对于此解决方案,您需要创建一个表,在其中存储实体标识符,下一列将是该标识符的最后一个值

例如:

Table sequencer
id | entity_name | entity_id
88 | customers   | 77
实体模型需要通知id已生成,并且在预持久化过程中,它需要为该id分配一个值,该值将来自该表中的实体id+1

select max(entity_id)+1 from sequencer where entity_name = 'customers';
这将导致运行两个额外的查询,一个在pre-persist上,另一个在post-persist上,这将使用新值更新sequencer表

有一些策略可以避免sequencer表上的并发,因此它总是具有正确的值,其中之一是通过锁定表o.0

3) 您可以编写自己的加载程序和持久化程序,但此时您可能会面临与UUID实现一样大的变化

很多ORM不支持这一点,如果你面临同样的问题,你可能不得不考虑上面的一个。


现在,如果你是专门与条令工作,我强烈建议你在IRC频道寻求帮助。他们为我提供了一些解决此问题的备选方案,非常有帮助。

为什么您需要此问题的复合密钥?为什么不把“id”作为主键呢?我不能给出详细信息,但让我给你一个使用复合键的场景。在任何给定的商店中,您都有POS,每个POS都有一个数据库,其中POS 1中有customer 1,POS 2中有customer 1。您无法确认POS 1中的客户1与POS 2中的客户1是同一个人,因此,如果您需要保持这两个POS同步,您将如何做到?一种解决方案是使用复合键。解决方案是将自动生成的字段移动到单独的表中,然后用OneTONE关系连接它。