PHP Symfony 固定装置和 Faker

PHP Symfony Fixtures & Faker

我开始学习 php symfony,我有一个问题。 我有两个实体:想法与另一个实体类别结合 我创建了一个固定装置来填充我的数据库,但我被困在了一个点上。这是我做的时候 ->setCategory();我如何注入随机类别(我有旅游、运动、娱乐、人际关系、其他)。 这是我开始的方式,并坚持使用 TYPE 类别的随机类别。感谢您的帮助

    public function load(ObjectManager $manager)
{
    // $product = new Product();
    // $manager->persist($product);

    $generator = Faker\Factory::create("fr_FR");

    for ($i = 0; $i < 101; $i++) {
        $idea = new Idea();
        $idea->setTitle($generator->title);
        $idea->setDescription($generator->realText(200));
        $idea->setAuthor($generator->firstName);
 --------- $idea->setCategory("RANDOM CATEGORY");---------
        $idea->setDateCreated($generator->dateTime);
        $idea->setIsPublished(true);

        $manager->persist($idea);
    }
        $manager->flush();
}

假设您已经创建了所有类别,您可以使用存储库获取所有类别实体的数组。然后在 for 循环中打乱数组并分配第一个。

$categories = $manager->getRepository(Category::class)->findAll();
for ($i = 0; $i < 101; $i++) {
  shuffle($categories);
  $idea = new Idea();
  ...
  $idea->setCategory($categories[0]);
  ...
  $manager->persist($idea);
}
$manager->flush();

或者使用 array_rand() 你不需要调用 shuffle() 的行,它只是从数组中选择一个随机键:

$categories = $manager->getRepository(Category::class)->findAll();
for ($i = 0; $i < 101; $i++) {
  $idea = new Idea();
  ...
  $idea->setCategory($categories[array_rand($categories)]);
  ...
  $manager->persist($idea);
}
$manager->flush();

如果您的类别是像这样的实体建议:

Here's how I started, and stuck for the random category of TYPE Category.

...并且您的不同实体有不同的固定装置,您可以利用 DependentFixtureInterface.

CategoryFixtures 可能看起来像这样。

<?php

namespace App\DataFixtures;

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

class CategoryFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $generator = Factory::create("fr_FR");

        for ($i = 0; $i <= 100; $i++) {
            $category = (new Category())->setName($generator->name);
            $manager->persist($category);
        }
        $manager->flush();
    }
}

然后你的 IdeaFixtures 可能看起来像这样。

<?php

namespace App\DataFixtures;

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

class IdeaFixtures extends Fixture implements DependentFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $generator  = Factory::create("fr_FR");
        $categories = $manager->getRepository(Category::class)->findAll();

        for ($i = 0; $i <= 100; $i++) {
            $idea = new Idea();
            $idea->setTitle($generator->title);
            $idea->setDescription($generator->realText(200));
            $idea->setAuthor($generator->firstName);
            $idea->setCategory($generator->randomElement($categories));
            $idea->setDateCreated($generator->dateTime);
            $idea->setIsPublished(true);

            $manager->persist($idea);
        }
        $manager->flush();
    }

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

这样你可以确保首先加载 CategoryFixtures,然后你将能够获取 IdeaFixtures 中的所有类别并利用 Faker randomElement() 随机获得一个类别方法。