Laravel 4:处理种子关系

时间:2013-02-02 20:37:35

标签: database many-to-many laravel laravel-4

是否有一种简单的方法可以在L4的新种子特征中管理多对多关系?

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

对于此类事情的良好工作流程有何想法?

3 个答案:

答案 0 :(得分:41)

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

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计数的唯一方法。如果您按照inserting related models上的指南进行操作,则可能不需要这种做法。

class PrimaryTableOneSeeder extends Seeder {

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

要在我的示例中使用mass assignment,并且作为文档的最新版本,您需要为模型指定一些保护列或可填充列。要做到这一点,只需在模型中添加属性,如下所示:

class Primaryone extends Eloquent {

protected $guarded = array('id');

答案 1 :(得分:3)

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

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

我已经在 Laravel 4 database seeding 上发布了一个小教程 - 这应该可以帮到你。此外,您可以参考seeding上的官方文档。

答案 2 :(得分:0)

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

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