【发布时间】:2015-06-04 01:33:24
【问题描述】:
我目前有一个表,它的主键是由 id + 外键组成的复合值。 id 是自动递增的,外键引用另一个表。
在我保存数据的那一刻,我只知道外键值,我希望 id 从数据库返回给我作为一个自动递增的数字。
我知道,Doctrine 不支持为复合主键自动生成 id,所以可以做些什么来允许 Doctrine 保存数据并仍然在部分复合键上自动递增。
注意,在提交这个问题之前,我已经研究了其他几个问题,例如:Defining Composite Key with Auto Increment in MySQL 和 Doctrine: authorize NULL in a foreign composite key,我还多次阅读 Doctrine 的文档,看看我是否遗漏了一些东西 http://doctrine-orm.readthedocs.org/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes
主要问题是关于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 值的行。
我怎样才能对 Doctrine 做同样的行为?有谁知道完成工作的任何方法或解决方法?
【问题讨论】:
-
为什么需要复合键?你为什么不把“id”作为主键呢?
-
我不能真正给你详细信息,但让我给你一个使用复合键的场景。在任何给定的商店中,您都有 POS,并且每个商店都有一个数据库,其中 POS 1 中的客户 1 和 POS 2 中的客户 1。您不能肯定 POS 1 中的客户 1 与客户 1 中的同一个人POS 2 所以,如果你需要让这 2 个 POS 保持同步,你会怎么做?一个解决方案是使用复合键。
-
解决方案是将自动生成的字段移动到单独的表中,然后将其与 OneToOne 关系加入。
标签: php mysql symfony doctrine-orm doctrine