Doctrine2:相关的密钥

时间:2011-06-14 22:32:15

标签: php doctrine-orm symfony

我有以下表格(类型,标识,标题)。

当创建新对象并且type = 1 id应为1时,type = 1 id = 2的下一个对象...但是当我创建type = 2时的id时,id应为1.

如何使用Doctrine2和Symfony2进行操作?

3 个答案:

答案 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。

  1. 到目前为止,Doctrine还没有很好地处理复合主键(typeid),所以我建议创建一个经典的主键:整数,自动增量键(至少对于Doctrine来说)使用)。此外,您始终可以在typetype_id列上添加唯一索引,并随时使用。
  2. 创建自己的type_id列自动增量实现:

    1. 由于type_id Type 相关联,您可以在type表中存储其他列:next_auto_increment,其中存储将用于下一条记录的值
    2. 每当您在表格中创建新记录时,只需从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);
      
    3. 每次插入记录时,数据库中还需要一个触发器来增加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类别都是它自己的实体,它在类表上共享公共数据并跟踪它自己的索引。

相关问题