Светильники Алисы — сохраняют и ссылаются на первый набор сущностей/объектов

Алиса отказалась от уровня сохраняемости в версии 3.x.

При попытке перехода с 2.2 на 3.0.x…
мне нужно сначала загрузить и сохранить некоторые фикстуры (чтобы их id заполнялись), а затем ссылаться на идентификаторы этих сущностей из другой группы файлов фикстур.
Как этого добиться?

Я предполагаю, что мне, возможно, придется зацикливать и загружать несколько наборов файлов фикстур по отдельности, но я понятия не имею, как ссылки на объекты будут существовать в таком сценарии.

Моя установка в настоящее время не работает, но вызывает следующую ошибку:

Недопустимое значение свойства "fooDbId" объекта "bar1" (класс: Doctrine\Model\Bar).

Мой FixturesLoader.php:

// …
use Nelmio\Alice\Loader\NativeLoader as AliceLoader;
// …
$loader = new AliceLoader();
$entities = $loader
    ->loadFiles(
        [
            __DIR__.'/foo.yml',
            /* ↓ Some more fixture files ↓ */,

           # Here comes "bar" which references persisted foo entities id
           # through its "fooDbId" property using expresion '@foo1->id'
            __DIR__.'/bar.yml'
        ],
        ['locale' => 'en_EN']
    )
    ->getObjects();

foreach ($entitites as $entity) {
    $manager->persist($entity)
}

$manager->flush();

bar.yml :

Doctrine\Model\Bar:
    bar1:
        fooDbId: '@foo1->id'
        # ↓ More properties ↓

Редактировать

fooDbId - это не "настоящее" поле отношения/внешнего ключа, а 0 идентификатор объекта Foo с левым дополнением. (Bar::setFooDbId отвечает за операцию заполнения слева). Пример: для экземпляра Foo со значением свойства id 87 связанный экземпляр Bar должен иметь свойство fooDbId, равное '00000087'.

Спасибо.


person Stphane    schedule 04.04.2018    source источник


Ответы (2)


Я предполагаю, что мне, возможно, придется зацикливать и загружать несколько наборов файлов фикстур отдельно, но я понятия не имею, как ссылки на объекты будут существовать в таком сценарии.

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

person Théo    schedule 04.04.2018
comment
Спасибо, я проверю это. На данный момент я жестко запрограммировал ожидаемый идентификатор. - person Stphane; 04.04.2018

Во-первых, нет необходимости создавать отдельный файл yml для каждой сущности.

Во-вторых, насколько я понял, вы пытаетесь подделать свои отношения Многие к Одному в доктрине. Если это так, вам не нужен этот подход. Doctrine всегда поможет вам думать об объектах, а не о базе данных. Вот пример того, как Алиса сделает одолжение.

Представьте, что сущность Bar имеет отношение «многие к одному» с Foo. Вот пример:

App\Entity\Foo:
    foo_{1..10}:
        title: <text(20)>
        isFeatured: <boolean(50)>

App\Entity\Bar:
    bar_{1..10}:
        username: <userName()>
        foo: '@foo_1' # This will assign the first foo generated above#

        foo: '@foo_*' # This will assign one the 10 generated foos above randomly!#

Опять же, Doctrine, как обычно, добавит внешний ключ.

person Soheil    schedule 05.04.2018
comment
Спасибо за ваше время. Я знаю, как правильно обрабатывать ссылки отношения ManyToOne от одного прибора к другому. В моем случае fooDbId должен быть строковым/целочисленным идентификатором, который будет передаваться через свойство Bar fooDbId setter, где применяется левое заполнение 0, значение должно сохраняться как есть (например, 00000087). Я знаю, это звучит странно, но это необходимо для работы других проектов (использующих ту же базу данных). Кстати, мы поместили фикстуры в отдельный файл, чтобы сделать поиск из редакторов кода более удобным при просмотре дерева каталогов проекта. - person Stphane; 05.04.2018