我有以下表格(类型,标识,标题)。
当创建新对象并且type = 1 id应为1时,type = 1 id = 2的下一个对象...但是当我创建type = 2时的id时,id应为1.
如何使用Doctrine2和Symfony2进行操作?
答案 0 :(得分:2)
像其他人所说的那样,Doctrine 2并没有开箱即用。通常的做法是使ID字段自动递增并且主键在这种情况下不可能。主键必须是唯一的。
话虽如此,解决方案可能是使用实体管理来查找ID的最大值,其中类型是所选类型并将该值递增1。
例如:
// Retrieve the current maximum ID for the selected type
$id = $em->createQuery("SELECT MAX(e.id) AS id FROM Entities\entity e WHERE e.type = ?1")
->setParameter(1, $type)
->getSingleScalarResult();
// Set your current entity's ID
$entity->setId(++$id);
// Save the entity
...
答案 1 :(得分:2)
使用MAX(id)
不是最好的解决方案,因为它可能会导致一些问题。如果删除给定类别中的最新记录然后添加新记录会发生什么?它将具有与之前相同的ID。
type
,id
),所以我建议创建一个经典的主键:整数,自动增量键(至少对于Doctrine来说)使用)。此外,您始终可以在type
和type_id
列上添加唯一索引,并随时使用。创建自己的type_id
列自动增量实现:
type_id
与 Type 相关联,您可以在type
表中存储其他列:next_auto_increment
,其中存储将用于下一条记录的值每当您在表格中创建新记录时,只需从type_id
表格中选择type
的值:
$type = ...;
$entity = new Entity();
$entity->setType($type);
$entity->setTypeId($type->getNextAutoIncrement());
// btw: typeId is not a very best name
$em->persist($entity);
每次插入记录时,数据库中还需要一个触发器来增加next_auto_increment
的值(MySQL示例):
DELIMITER $$
CREATE TRIGGER increment_ai AFTER insert ON entity_table FOR EACH ROW BEGIN
UPDATE type_table
SET next_auto_increment = next_auto_increment + 1
WHERE id = NEW.type;
END$$
DELIMITER ;
答案 2 :(得分:1)
正如我上面的评论所表明的那样,我认为没有直接支持你想要开箱即用的东西。但是,我认为您应该能够使用class table inheritance来近似它,其中每个type
类别都是它自己的实体,它在类表上共享公共数据并跟踪它自己的索引。