Как вставить фиктивные данные через фикстуры в чужую колонку Symfony - PullRequest
0 голосов
/ 03 марта 2019

У меня есть две сущности user и post.Я пытаюсь сбросить фиктивные данные для публикации таблицы с помощью приборов.Теперь проблема в том, что я не смог вставить данные в столбец author, который содержит отношение ManyToOne с сущностью User.

Я пытался вставить фиктивные данные, передавая идентификатор напрямую следующим образом:

        for($i=0;$i<20;$i++)
        {

            $post = new Post();
            $post->setTitle($this->faker->realText(20));
            $post->setContent($this->faker->text);
            $post->setIsPublished(true);
            $post->setAuthor('1');
            $post->setPublishedAt(new \DateTime());
            $post->setCreatedAt(new \DateTime());
            $post->setUpdatedAt(new \DateTime());
            $manager->persist($post);

            $manager->flush();
        }

Но возникает ошибка:

Argument 1 passed to App\Entity\Post::setAuthor() must be an instance of App\Entity\User or null, string given

Есть ли способ выбратьодин из пользователей от сущности «Пользователь» и вставьте его в столбец случайным образом.

Обновление:

После просмотра этой документации я могу предоставить ссылку

UserFixtures:

    public const ADMIN_USER_REFERENCE = 'admin-user';

    public function load(ObjectManager $manager)
    {
        ......
        $this->addReference(self::ADMIN_USER_REFERENCE, $userAdmin);
    }

PostFixtures:

$post->setAuthor($this->getReference(UserFixtures::ADMIN_USER_REFERENCE ));

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

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Для этого у меня есть класс BaseFixture, который имеет функцию createMany

protected function createMany(string $classname, int $count, callable $factory)
{
    for ($i = 0; $i < $count; $i++) {
        $entity = new $classname();
        $factory($entity, $i);

        $this->manager->persist($entity);

        $this->addReference($classname.'_'.$i, $entity);
    }
}

и функцию getRandomReference:

protected function getRandomReference(string $className)
{
    if (!isset($this->referencesIndex[$className])) {
        $this->referencesIndex[$className] = [];
        foreach ($this->referenceRepository->getReferences() as $key => $ref) {
            if (strpos($key, $className.'_') === 0) {
                $this->referencesIndex[$className][] = $key;
            }
        }
    }
    if (empty($this->referencesIndex[$className])) {
        throw new \Exception(sprintf('Cannot find any references for class "%s"', $className));
    }
    $randomReferenceKey = $this->faker->randomElement($this->referencesIndex[$className]);

    return $this->getReference($randomReferenceKey);
}

Теперь, скажем, я хочу создать приборы длякласс компании и класс адреса,

Сначала я сгенерирую данные для адреса:

class AddressFixtures extends BaseFixture {
    public function loadData {
        this->createMany(Address::class, 30, function(Address $address, $count) {
       $address->setDescription($this->faker->paragraph);
       ...

        });
    }
}

Поскольку я использовал класс createMany из базового класса, ссылки теперь добавляются автоматически длякаждый прибор.

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

class CompanyFixtures extends BaseFixture implements DependentFixtureInterface
{
    public function loadData(ObjectManager $manager)
    {
        $company = new Company();
        $company->setAddress($this->getRandomReference(Address::class));
    }
}

Я просто хочу отметить, что большая часть этого, если нетвсе (я точно не помню, это было давно) взято из учебника SymfonyCasts, которому я следовал.

0 голосов
/ 03 марта 2019

в этом случае вы должны использовать ссылку Приборы Symfony DOC

Совместное использование объектов между приборами¶

Например, при созданииAuthor, вы можете «сохранить» его в качестве ссылки следующим образом:

$this->addReference('author-reference', $author);

Затем в вашем другом приборе, для которого требуется ссылка на Author, вы можете сделать что-то вроде этого:

$author = $this->getReference('author-reference');

Надеюсь, это поможет вам, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...