Symfony Fixtures - Получить случайный экземпляр сущности - PullRequest
0 голосов
/ 27 апреля 2018

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

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

Как я могу получить ссылку на случайную категорию?

   <?php

    namespace App\DataFixtures;

    use App\Entity\Category;
    use App\Entity\User;
    use App\Entity\Post;
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Doctrine\Common\Persistence\ObjectManager;
    use Doctrine\ORM\EntityManager;
    use Faker\Factory;
    use Faker\Generator;

    class AppFixtures extends Fixture
    {
        private $faker;

        public function load(ObjectManager $manager)
        {
            $this->faker = Factory::create();
            $this->addUsers($manager);
            $this->addCategories($manager);
            $this->addPosts($manager);

            $manager->flush();
        }

        private function addUsers(EntityManager $em)
        {
            for ($i = 1; $i <= 10; $i++) {
                $user = new User();
                $firstname = $this->faker->firstName;
                $lastname = $this->faker->lastName;
                $user->setFirstName($firstname);
                $user->setLastName($lastname);
                $user->setEmail($firstname.'.'.$lastname.'@gmail.com');
                $user->setRoles(['ROLE_USER']);
                $em->persist($user);
                $this->addPosts($user);
            }
        }

        private function addCategories(EntityManager $em)
        {
            $categoryHome = new Category();
            $categoryHome->setName('Home');
            $em->persist($categoryHome);

            $categoryWork = new Category();
            $categoryWork->setName('Work');
            $em->persist($categoryWork);
        }

        public function addPosts(EntityManager $em, User $user){
            for ($i = 1; $i <= 10; $i++) {
                $post = new Post();
                $post->setUser($user);
                // How can I assign the category randomly?
                $post->setCaterory(????)
                $em->persist($post);
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

В функции AddPost Добавить это

    public function addPosts(EntityManager $em, User $user){


       $categories = $manager->getRepository(Category::class)->findAll();

        for ($i = 1; $i <= 10; $i++) {
            $post = new Post();
            $post->setUser($user);

            $category = $categories[array_rand($categories)];

            $post->setCategory($category)

            $em->persist($post);
        }
    }
}
0 голосов
/ 27 апреля 2018

Если вам нужно создать случайные данные (например, для представления), я думаю, что лучшим выбором будет использование AliceBundle https://github.com/hautelook/AliceBundle, которое может сделать это из коробки через отношения. Плюс это будет одинаково при каждой загрузке светильников.

Но чтобы ответить на ваш вопрос. Вы создаете список категорий, которые вы создали, а затем просто выбираете одну случайным образом.

 <?php

namespace App\DataFixtures;

use App\Entity\Category;
use App\Entity\User;
use App\Entity\Post;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityManager;
use Faker\Factory;
use Faker\Generator;

class AppFixtures extends Fixture
{
    private $faker;

    private $categories;

    public function load(ObjectManager $manager)
    {
        $this->faker = Factory::create();
        $this->addUsers($manager);
        $this->addCategories($manager);
        $this->addPosts($manager);

        $manager->flush();
    }

    private function addUsers(EntityManager $em)
    {
        for ($i = 1; $i <= 10; $i++) {
            $user = new User();
            $firstname = $this->faker->firstName;
            $lastname = $this->faker->lastName;
            $user->setFirstName($firstname);
            $user->setLastName($lastname);
            $user->setEmail($firstname.'.'.$lastname.'@gmail.com');
            $user->setRoles(['ROLE_USER']);
            $em->persist($user);
            $this->addPosts($user);
        }
    }

    private function addCategories(EntityManager $em)
    {
        $categoryHome = new Category();
        $categoryHome->setName('Home');
        $em->persist($categoryHome);

        $this->categories[] = $categoryHome;

        $categoryWork = new Category();
        $categoryWork->setName('Work');
        $em->persist($categoryWork);

        $this->categories[] = $categoryWork;
    }

    public function addPosts(EntityManager $em, User $user){
        for ($i = 1; $i <= 10; $i++) {
            $post = new Post();
            $post->setUser($user);


            $post->setCaterory($this->categories[rand(0, count($this->categories))]);
            $em->persist($post);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...