У меня есть стол 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);
}
}
}
}
Есть ли лучшая практика?
Вы могли бы использовать 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'));
Других решений пока нет …