Eloquent Seeder — только добавить, если данные не существуют

У меня есть стол 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);
}
}
}
}

Есть ли лучшая практика?

3

Решение

Вы могли бы использовать firstOrCreate($permission) на ваше Permission модель вместо? Это устранит некоторый код для вас.

foreach($permissions as $permission) {

Permission::firstOrCreate($permission);

}

Имейте в виду, вам нужно установить свой protected $fillable; Атрибут внутри вашей модели, чтобы ваши поля были назначены массово.

РЕДАКТИРОВАТЬ: Вы также можете хранить свои разрешения в файле конфигурации в вашем проекте, чтобы его было проще получить. Похоже, более естественное место, чтобы поместить его, а не статический внутри самого кода.

РЕДАКТИРОВАТЬ № 2: Массовое Назначение Ссылка Здесь

Прямо из документов Laravel:

Свойство fillable указывает, какие атрибуты должны назначаться по массе. Это может быть установлено на уровне класса или экземпляра.

class User extends Eloquent {

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

}

РЕДАКТИРОВАТЬ № 3:

Я бы также предложил не смешивать беглый с красноречивый моделей. Вы уже включили 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]