#laravel #pivot-table
Вопрос:
Мне интересно, как заполнить сводную таблицу всеми возможными значениями.
У меня есть таблица пользователей :
//users table
id | name
Таблица notification_preferences :
//notification_preferences table
id | name
И ссылка на ссылку user_notification_preference
//user_notification_preference
id | user_id | notification_preference_id | is_enabled
Я хотел бы заполнить свою сводную таблицу всеми существующими ссылками notification_preference со значением is_enabled, равным true, и, когда я создаю новую ссылку notification_preference, она должна синхронизироваться с ней снова со значением is_enabled, равным true.
Есть ли общий способ сделать это ?
Комментарии:
1. Я не знаю, понимаю ли я, о чем вы спрашиваете … В какой момент вы хотите заполнить сводную таблицу всеми существующими ссылками notification_preference? Чтобы установить значение is_enabled в значение true по умолчанию, вы можете сделать это на уровне БД, установив этот столбец с
->default(1)
Ответ №1:
Вы должны использовать event closure
свою NotificationPreference
модель, поэтому, когда вы ее создаете, она создает все необходимые связанные записи.
Что-то подобное должно сработать для вас:
class NotificationPreference extends Model
{
protected static function booted()
{
static::created(function ($notificationPreference) {
User::chunk(50, function($users) use ($notificationPreference){
foreach($users as $user) {
$user->NotificationPreferences()->attach($notificationPreference->id, [
'is_enabled' => true
]);
}
});
});
}
}
Примечания:
- Мы рассмотрели, что есть
belongsToMany
вUser
модели с именемNotificationPreferences
. - Мы используем
chunk
, так как может быть много пользователей.
Обновить:
Для предыдущих записей вы можете запустить миграцию, которая заполнит ваши сводные таблицы. Что-то вроде этого:
class PopulateNotificationPreferencePivotTable extends Migration
{
public function up()
{
NotificationPreference::chunk(50, function ($notificationPreferences) {
foreach ($notificationPreferences as $notificationPreference) {
User::chunk(50, function ($users) use ($notificationPreference) {
foreach ($users as $user) {
if (!$user->NotificationPreference()->where('id', $notificationPreference->id)->exists()) {
$user->NotificationPreference()->attach($notificationPreference->id, [
'is_enabled' => true
]);
}
}
});
}
});
}
}
Примечания:
- Снова мы используем chunk, так как их может быть много
NotiticationPreference
. - Мы проверяем, есть ли уже доступная сводная запись.