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();
,

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

这就是我开始的方式,并坚持使用 TYPE 的随机类别 类别。

...并且您对不同的实体有不同的装置,您可以利用 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() 方法随机获得一个类别。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...