Как получить объект из базы данных в Fixtures Symfony - PullRequest
1 голос
/ 03 апреля 2020

Я хочу создавать поддельные посты с помощью класса PostFixtures. Я использую поддельные данные с "title, slug, content, pushlish_at". Но с «автором», я хочу использовать данные из базы данных (пользовательская таблица). Я не знаю, как это получить. Пожалуйста, помогите мне!

Вот мой код:

<?php

namespace App\DataFixtures;

use Faker\Factory;
use App\Entity\Post;
use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;


class PostFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $faker = Factory::create();

        for ($i = 0; $i< 10; $i++) {
            $post = new Post();

            $post->setTitle($faker->title());
            $post->setSlug($faker->slug());
            $post->setContent($faker->paragraph());
            $post->setPublishAt($faker->dateTimeBetween('-100 days', '-1 days'));

            $userRepository = $manager->getRepository(User::class);
            $user = $userRepository->find(rand(1, 3));
            $post->setAuthor($user);

            $manager->persist($post);
        }

        $manager->flush();
    }

}

В базе данных у меня всего три пользователя (идентификатор от 1 до 3). И я создал связь ManyToOne между классом Post и User. Но я не знаю, почему $ user имеет значение null.

ОБНОВЛЕНИЕ

UserFixtures класс:

<?php

namespace App\DataFixtures;

use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class UserFixtures extends Fixture
{
    public const USER_REFERENCE = 'users';
    private $passwordEncoder;

    /**
     * UserFixtures constructor.
     */
    public function __construct(UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->passwordEncoder = $passwordEncoder;
    }


    public function load(ObjectManager $manager)
    {
        $user1 = new User();
        $user1->setEmail('tien@gmail.com');
        $user1->setPassword(
            $this->passwordEncoder->encodePassword(
                $user1,
                '123456'
            )
        );
        $user1->setRoles(['ROLE_ADMIN']);
        $manager->persist($user1);
        $manager->flush();
        dump($user1); // it still has value
        $this->addReference(self::USER_REFERENCE, $user1);
    }
}

PostFixtures класс:

<?php

namespace App\DataFixtures;

use Faker\Factory;
use App\Entity\Post;
use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;

class PostFixtures extends Fixture implements DependentFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $faker = Factory::create('en_US');

        $user =  $this->getReference(UserFixtures::USER_REFERENCE);
        dd($user);  // I want to check it: $user still has id . But 
                   // email,role and password are null

        for ($i = 0; $i < 10; $i++) {
            $post = new Post();
            $post->setTitle($faker->title());
            $post->setSlug($faker->slug());
            $post->setContent($faker->paragraph());
            $post->setPublishAt($faker->dateTimeBetween('-100 days', '-1 days'));
            $post->setAuthor($user);
            $manager->persist($post);
        }
        $manager->flush();
    }

    public function getDependencies()
    {
        return array(
            UserFixtures::class,
        );
    }

}

1 Ответ

1 голос
/ 03 апреля 2020

Вы определенно ищете эталонный API, который определен в Doctrine\Common\DataFixtures\AbstractFixture пространстве имен.

В вашем определении UserFixtures сделайте следующее:

$user = new User();
$user->setName(...);

$manager->persist($user);
$this->addReference('user_john', $user);
...
$manager->flush();

А затем в вашем PostFixtures

$post = new Post();
$post->setAuthor($this-getReference('user_john')); 

и не забудьте добавить зависимости, поэтому Doctrine будет знать точный порядок (загружать пользователей перед статьями)

public function getDependencies()
{
    return [UserFixtures::class];
}

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

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