Eloquent Seeder - 仅在数据不存在时添加

时间:2014-11-13 20:58:31

标签: php laravel laravel-4 eloquent seeding

我有一张名为permissions的表格;这就像用户可以拥有的不同角色。随着项目的增长,我可能会添加更多功能,因此会创建更多permissions

我有一个PermissionSeeder.php,我想继续添加我添加的权限。然后,每次添加新权限时,我都希望在其上运行播种机。但是,不应创建现有条目。

我在考虑在每次更新时截断表,但是其他数据透视表上的permission_id会发生冲突,因为它们是外键。

这就是我现在要做的事情:

use Permission;
class PermissionSeeder extends Seeder {

    public function run()
    {
        $permissions = [...]; // this is the array of ALL permissions that will keep on growing

        foreach ($permissions as $permission) {
            $model = Permission::whereName($permission['name']);
            if ($model->count() <= 0) {
                DB::table('permissions')->insert($permission);
            }
        }
    }
}

有更好的做法吗?

1 个答案:

答案 0 :(得分:1)

您可以在firstOrCreate($permission)型号上使用Permission吗?这会为你消除一些代码。

foreach($permissions as $permission) {

    Permission::firstOrCreate($permission);

}

请注意,您需要在模型中设置protected $fillable;属性,以便对字段进行批量分配。

编辑:您还可以将权限存储在项目的配置文件中,以便更容易访问。看起来像是一个更自然的地方,而不是代码本身内部的静态。

编辑#2:Mass Assignment Link Here

直接来自laravel docs:

fillable属性指定哪些属性应该是可批量分配的。这可以在类或实例级别设置。

class User extends Eloquent {

    protected $fillable = array('first_name', 'last_name', 'email');

}

编辑#3:

我还建议不要将fluenteloquent模型混合使用。您已将Permission模型添加到播种机中。如果权限表的名称发生更改,您应该使用它,因此您只需要更改模型中的protected $table;属性。


直接来自Laravel Docs的示例:

// Retrieve the user by the attributes, or create it if it doesn't exist...
$user = User::firstOrCreate(array('name' => 'John'));

Laravel Docs