bobthecow / population
简化 Doctrine 2 数据库填充的方法
dev-master / 1.0.x-dev
2012-12-08 19:43 UTC
Requires
- php: >=5.3.0
Suggests
- doctrine/data-fixtures: Population provides a base data fixtures class
- doctrine/mongodb-odm: Population can populate ODM documents
- doctrine/orm: Population can populate ORM entities
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
选项,则您的工厂将接收这些参数。