【问题标题】:Populate pivot table with all possible value + extra column使用所有可能的值 + 额外列填充数据透视表
【发布时间】:2021-08-03 14:06:13
【问题描述】:

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

我有一个用户表:

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

有没有通用的方法呢?

【问题讨论】:

  • 我不知道我是否明白你在问什么......你想在什么时候用所有现有的 notification_preference 填充数据透视表?要将 is_enabled 值默认设置为 true,您可以在 DB 级别使用 ->default(1) 设置该列

标签: laravel pivot-table


【解决方案1】:

您应该在您的NotificationPreference 模型上使用event closure,因此当您创建一个模型时,它会创建所有必要的相关记录。

这样的东西应该适合你:

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

注意事项:

  • 我们再次使用块,因为可能有很多 NotiticationPreference
  • 我们检查是否已有可用的数据透视记录。

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多