bobthecow/population

简化 Doctrine 2 数据库填充的方法

dev-master / 1.0.x-dev 2012-12-08 19:43 UTC

This package is auto-updated.

Last update: 2024-09-20 10:28:43 UTC


README

简化 Doctrine 2 数据库的填充方法。

受到 ActiveRecord 的 Populator 的启发。

使用方法

您确实应该使用这个库配合 Faker。您很快就会明白原因。

使用 Population 的最简单方法是扩展 \Population\DataFixture。它是 ORM 和 ODM 数据固定有效的基类

<?php

namespace Application\BlogBundle\DataFixtures\ORM;

use Doctrine\ORM\EntityManager;
use MyApplication\BlogBundle\Document\Post;
use MyApplication\BlogBundle\Document\Comment;

class BlogPostsFixture extends \Population\DataFixture
{
    public function load(EntityManager $em)
    {
        // Generate 10 blog posts
        $this->populate($em->getRepository('MainBundle:Post'), 10, function(Post $post) {
            $post->setTitle(\Faker\Lorem::sentence());
            $post->setContent(implode("\n\n", \Faker\Lorem::paragraphs(6)));
            $post->setCreatedAt(new \DateTime(\Faker\DateTime::timestamp()));
        });

        // Add a few comments to each
        foreach ($em->getRepository('BlogBundle:Post')->find() as $post) {
            $this->populate($em->getRepository('BlogBundle:Comment'), rand(5, 10), function(Comment $comment) {
                $name = \Faker\Name::name();
                $comment->setAuthor($name);
                $comment->setEmail(\Faker\Internet::email($name));
                $comment->setSubject(\Faker\Lorem::sentence());
                $comment->setContent(\Faker\Lorem::paragraph());
                $comment->setCreatedAt(new \DateTime(\Faker\DateTime::timestamp()));
                $comment->setPost($post);
            });
        }
    }
}

如果您需要在其他地方使用 Population,或者如果您不太喜欢使用基类,您可以使用 Populator 服务独立进行

<?php

$populator = new Populator();
$populator->populate($em->getRepository('BlogBundle:Category'), 5, function($category) {
    $name = \Faker\Lorem::word();
    $category->setName($name);
    $category->setSlug(strtolower($name));
});

$categories = $em->getRepository('BlogBundle:Category')->find()->toArray();
foreach ($em->getRepository('BlogBundle:Post') as $post) {
    $post->setCategory($categories[array_rand($categories)]);
}

$em->flush();

高级使用

populate 接受一些额外的选项

<?php

$populator = new Populator();
$populator->populate($em->getRepository('BlogBundle:Tag'), 1000, function($tag) {
    $tag->setName(\Faker\Lorem::word());
}, array(
    'perFlush'        => 10,
    'clearAfterFlush' => false,
    'factory'         => function($tagName) {
        return new Tag($tagName);
    },
    'constructorArgs' => array('foo'),
));
  • perFlush 将限制单个查询中冲刷的对象数量。默认为 100。设置为 0 或 false 以只在整个末尾冲刷一次。

  • clearAfterFlush 允许您禁用在每次冲刷后清除 ObjectManager。将此更改为 false 可能会使事物变得非常慢,或者可能崩溃。

  • factory 是一个可选的回调,用于构建填充的对象。如果您的类需要构造函数依赖注入或特殊实例化,请使用此选项。

  • constructorArgs 是一个参数数组,直接传递给对象的构造函数。如果您指定了 factory 选项,则您的工厂将接收这些参数。