【问题标题】:Eloquent Seeder - only add if data doesn't existEloquent Seeder - 仅在数据不存在时添加
【发布时间】:2015-01-11 03:40:15
【问题描述】:

我有一张桌子叫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);
            }
        }
    }
}

有更好的做法吗?

【问题讨论】:

    标签: php laravel laravel-4 eloquent seeding


    【解决方案1】:

    您可以在您的Permission 模型上使用firstOrCreate($permission) 代替吗?这将为您消除一些代码。

    foreach($permissions as $permission) {
    
        Permission::firstOrCreate($permission);
    
    }
    

    请记住,您需要在模型中设置 protected $fillable; 属性以允许批量分配字段。

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

    编辑#2:Mass Assignment Link Here

    直接来自 laravel 文档:

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

    class User extends Eloquent {
    
        protected $fillable = array('first_name', 'last_name', 'email');
    
    }
    

    编辑#3:

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


    直接来自 Laravel 文档的示例:

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

    Laravel Docs

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 2021-04-21
      • 2017-11-17
      • 2014-01-05
      • 2016-08-04
      • 1970-01-01
      • 2012-04-22
      • 2018-02-12
      相关资源
      最近更新 更多