首页 > 解决方案 > 使用所有可能的值 + 额外列填充数据透视表

问题描述

我想知道如何用所有可能的值填充数据透视表。

我有一个用户表:

//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。

有没有一种通用的方法来做到这一点?

标签: laravelpivot-table

解决方案


您应该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
                    ]);
                }
            });
        });
    }
}

笔记:

  • 我们已经考虑belongsToManyUserModel 中有 name 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.
  • 我们检查是否已经有可用的数据透视记录。

推荐阅读