laravel - 使用所有可能的值 + 额外列填充数据透视表
问题描述
我想知道如何用所有可能的值填充数据透视表。
我有一个用户表:
//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。
有没有一种通用的方法来做到这一点?
解决方案
您应该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
Model 中有 nameNotificationPreferences
。 - 我们使用
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
. - 我们检查是否已经有可用的数据透视记录。
推荐阅读
- python - 根据一天中的时间段概率生成日期时间
- python - Pytorch:所有但一个总和?
- python - 是否可以使用神经网络/人工智能来“优化”比赛时间?
- android - 如何登录纯kotlin代码(不能使用Log.v)
- java - Python代码中的Java HashMap抛出错误
- php - 查询 SELECT * FROM 多个表
- android - 将“com.google.gms.google-services”插件与 android 应用程序集成时出现问题
- c++ - 错误:无法根据转换为“int”类型来解析重载函数
- javascript - 使用 JQuery 或在 UI 中取消选择选项后无法选择选项
- java - 如何正确使用 UUID 作为 @Entity 的 @Id?