Доктрина 2.0 Кэширование и значения по умолчанию - PullRequest
0 голосов
/ 27 июня 2011

Использование Doctrine 2.x

Несколько, если сущности в моем домене сопоставлены с таблицами, имеющими только одну строку - это для поддержки дополнительной сложности в будущем (запланировано - так что это не соответствует YAGNI).

В качестве примера рассмотрим простую сущность

Category\Type:
  type: entity
  table: category_type
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    name:
      type: string

В моем приложении на данный момент у меня есть только один тип категории (имя = 'обычная'), но каждый раз, когда я создаю новую категорию (сущность не показана - используйте ваше воображение; она имеет отношение N: 1 к категории \) Тип) Мне нужно связать тип с категорией. Это означает, что мне нужно извлечь мою единственную строку из базы данных, а затем установить связь.

$category = new Category();
$type = $em->getRepository('Category\Type')->findByName('regular');
$category->setType($type);
$em->persist($category);
$em->flush();

Я хочу знать, как мне избежать этого.

Если я просто использую новый тип, подобный этому ...

$category = new Category();
$type = new Category\Type();
$type->setName('regular');
$category->setType($type);
$category->setId(1); // <-- This gets incremented anyway after the persist is called
$em->persist($category);
$em->flush();

Затем доктрина пытается вставить тип в качестве новой сущности (на самом деле это не удается, поскольку столбец имени имеет уникальное ограничение в базе данных).

Я пытался сделать выше, а затем использовать слияние

http://www.doctrine -project.org / документы / ОРМ / 2,0 / ы / ссылки / рабочий-с objects.html # слияние-объектов

Но происходит то же самое.

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

Неуместно ли эффективно «кэшировать» это в коде - должен ли я использовать один из других механизмов кэширования?

1 Ответ

1 голос
/ 27 июня 2011

Ваш оригинальный подход - правильный.

$category = new Category();
$type = $em->getRepository('Category\Type')->findByName('regular');
$category->setType($type);
$em->persist($category);
$em->flush();

Так устроена Доктрина.

То, что вы пытаетесь сделать, - это получить (найти) экземпляр объекта, установив для свойства name значение, которое уже существует.Это не верно.Это все равно что звонить своему ребенку Джону Леннону и ожидать, что он воскресит Битлз.

...