15

在 L4 的新种子功能中是否有一种简单的方法来管理多对多关系?

一种方法是为数据透视表制作种子,但我会做很多工作。

对这类事情的良好工作流程有什么想法吗?

4

3 回答 3

43

在最新版本的 Laravel 4 中,您可以在 DatabaseSeeder 类的“运行”方法中定义所有播种脚本的运行顺序。

public function run()
{
    DB::statement('SET FOREIGN_KEY_CHECKS=0;');

    $this->call('PrimaryTableOneSeeder');
    $this->command->info('The first primary table has been seeded!');

    $this->call('PrimaryTableTwoSeeder');
    $this->command->info('The second primary table has been seeded!');

    $this->call('PivotTableSeeder');
    $this->command->info('The pivot table has been seeded!');

    DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}

您会注意到我在运行所有种子之前和之后禁用了外键约束。这可能是不好的做法,但这是我可以使用 truncate 函数重新设置每个表的 id 计数的唯一方法。如果您按照插入相关模型的指南进行操作,则可能不需要此做法。

class PrimaryTableOneSeeder extends Seeder {

public function run()
{
    DB::table('primaryone')->truncate();
    Primaryone::create(array(
        'field' => 'value',
        'created_at' => new DateTime,
        'updated_at' => new DateTime
    ));
}

要像我在示例中所做的以及最新版本的文档那样使用质量分配,您需要为模型指定一些受保护的或可填充的列。为此,只需将属性添加到您的模型中,如下所示:

class Primaryone extends Eloquent {

protected $guarded = array('id');
于 2013-03-29T09:59:16.850 回答
3

Laravel 种子文件是常规的 PHP 脚本(除了它们需要返回一个数组)。您可以在种子文件中查询数据库(使用 Eloquent、Fluent builder 甚至 PDO)。

解决多对多问题的一种方法是故意命名您的种子文件,以便最后填充数据透视表...例如,您可以在文件名前添加一个数值(即 1_authors.php、2_books. php、3_authors_books.php 等)。Artisan 在执行文件之前按字母顺序对文件名进行排序。

我已经发布了一个关于Laravel 4 数据库播种的小教程——这应该能让你继续前进。另外,你可以参考官方的种子文档。

于 2013-02-04T02:45:00.367 回答
0

种子用于简单信息、测试数据和静态信息。我不建议用它来处理关系。就个人而言,我只将它用于每个表的 2 或 3 条记录,以帮助测试我的应用程序。

在开发应用程序时,请考虑先处理数据输入(管理)区域,然后再处理前端。这样您就可以轻松添加测试数据。

于 2013-02-03T21:38:29.840 回答