Doctrine2: связанные ключи - PullRequest
1 голос
/ 15 июня 2011

У меня есть следующая таблица (тип, идентификатор, заголовок).

Когда создается новый объект и id типа = 1 должен быть 1, следующий объект с идентификатором type = 1 = 2 ... Но когда я создаю объект с идентификатором type = 2, идентификатор должен быть 1.

Как я могу сделать это с Doctrine2 и Symfony2?

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Как и другие говорили, Доктрина 2 не делает этого из коробки.Обычной практикой является автоматическое увеличение поля идентификатора и первичного ключа, в этом случае это невозможно.Первичные ключи должны быть уникальными.

С учетом сказанного, решение может состоять в том, чтобы использовать сущность, управляющую для нахождения максимального значения 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
...
2 голосов
/ 17 июня 2011

Использование MAX(id) не очень удачное решение, так как может вызвать несколько проблем.Что произойдет, если вы удалите самую новую запись в данной категории, а затем добавите новую?Он будет иметь тот же идентификатор, что и предыдущий.

  1. Составные первичные ключи (type, id) пока не очень хорошо обрабатываются Doctrine, поэтому я предлагаю создать классический первичныйключ: целое число, ключ автоинкремента (по крайней мере, для использования Doctrine).Кроме того, вы всегда можете иметь уникальный индекс для столбцов type и type_id и использовать его в любое время.
  2. Создайте собственную реализацию для автоинкрементации столбца type_id:

    1. Поскольку type_id связан с Тип , вы можете сохранить дополнительный столбец в таблице 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 ;
      
1 голос
/ 15 июня 2011

Как показывают мои комментарии выше, я не думаю, что есть прямая поддержка того, что вы пытаетесь сделать из коробки.Тем не менее, я думаю, что вы должны быть в состоянии аппроксимировать это с наследованием таблицы классов , где каждая из ваших type категорий является собственной сущностью, которая разделяет общие данные в таблице классов и отслеживает собственную индексацию.

...