我希望给一个实体(发票、订单、预订等)分配一个唯一的序列号,但只在该年内唯一。因此,每年的第一张发票(或其他字段,例如客户)开始时的ID为1。这意味着可以有一个复合主键(年份、ID)或一个主键(即invoice_id)和另外两个唯一的列。
我的问题是:使用Doctrine2和Symfony2,给对象分配自动生成的ID和另一个值的唯一组合的最佳方法是什么? 复合键上的Doctrine限制 Doctrine无法为具有复合主键的实体分配自动生成的ID(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html):
纯粹的选项:仅适用于MyISAM
我发现基于this answer的“纯”MySQL / MyISAM解决方案。
由于Doctrine2的限制,这种方法行不通,因此我正在寻找一种Doctrine ORM等效于这个原始MySQL解决方案的方法。
其他解决方案:
对于InnoDB也有解决方案:在MySQL中定义带自增复合键。
我的问题是:使用Doctrine2和Symfony2,给对象分配自动生成的ID和另一个值的唯一组合的最佳方法是什么? 复合键上的Doctrine限制 Doctrine无法为具有复合主键的实体分配自动生成的ID(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html):
手动设置序列号 所以我必须手动分配一个ID。为了做到这一点,我尝试查找特定年份中最高的ID,并将新实体分配为该ID + 1。我怀疑这不是最好的方法,即使是最好的方法,我也没有找到最好的(DRY)方法来实现它。由于我认为这是一个通用问题,并且我想防止 XY-problem,所以我开始了这个问题。每个具有复合键的实体都不能使用“ASSIGNED”以外的ID生成器。这意味着在调用
EntityManager#persist($entity)
之前必须设置ID字段的值。
纯粹的选项:仅适用于MyISAM
我发现基于this answer的“纯”MySQL / MyISAM解决方案。
CREATE TABLE IF NOT EXISTS `invoice` (
`year` int(1) NOT NULL,
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`year`,`id`)
) ENGINE=MyISAM;
由于Doctrine2的限制,这种方法行不通,因此我正在寻找一种Doctrine ORM等效于这个原始MySQL解决方案的方法。
其他解决方案:
对于InnoDB也有解决方案:在MySQL中定义带自增复合键。
UNIQUE KEY
。 - Clockwork-Muse