Кэширование и умолчания Doctine 2.0

141
21

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

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

В качестве примера рассмотрим простой объект

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

В моем приложении на данный момент у меня есть только один тип категории (name = 'regular'), но каждый раз, когда я создаю новую категорию (сущность не показана - используйте свое воображение, она имеет отношение 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/docs/orm/2.0/en/reference/working-with-objects.html#merging-entities

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

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

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

спросил(а) 2021-01-25T15:51:27+03:00 4 месяца, 3 недели назад
1
Решение
63

Ваш оригинальный подход является правильным.

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

Именно так разработана Доктрина.

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

ответил(а) 2021-01-25T15:51:27+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема