Заполните сводную таблицу всеми возможными значениями дополнительный столбец

#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 .
  • Мы проверяем, есть ли уже доступная сводная запись.