Laravel updateOrCreate 与 hasMany 关系

Posted

技术标签:

【中文标题】Laravel updateOrCreate 与 hasMany 关系【英文标题】:Laravel updateOrCreate with hasMany relationship 【发布时间】:2021-09-24 08:26:17 【问题描述】:

我的用户可以有多个参数。例如,它们被称为 user_param_1、user_param_2、...、user_param_n。这是动态的。它是一个单独的表 user_parameters,其中存储了 id、user_id、name 和 value。 UsersUserParameters 之间的关系是 belongsTo 和 hasMany。问题是:

编辑时,我想动态保持它,如果用户有一个 user_param_n+1,它应该被创建。但是我已经无法为现有参数编写条件了。

我自己创建了一个 userParameters 数组,它只包含来自 $request 变量的必要参数。数组如下所示:

[
  0 => [
    "name" => "par1"
    "value" => "var1"
  ]
  1 => [
    "name" => "par2"
    "value" => "var2"
  ]
  2 => [
    "name" => "par3"
    "value" => "var3"
  ]
]

然后我想保存它。我的控制器知道用户,所以我可以访问 $user->id。

foreach ($userParameters as $userParameter) 
        $user->parameters()->updateOrCreate(['id' => $user->parameters->id, 'user_id' => $user->id], $userParameter);

问题是,$user->parameters 是一组雄辩的模型。条件不对。我无法直接访问 id。但是我该如何解决呢?我需要像“['id' => [IF-DATABASE-ID-EXISTS-IN-ARRAY-$user-parameters]”这样的东西......但是如何以一种雄辩的方式?

提前致谢!

最好的问候

【问题讨论】:

【参考方案1】:

我认为您需要使用 user_id 和 parameter_name 获取现有参数,因为这是该参数行的唯一性,如果没有具有此名称的参数,它将使用 user_id & parameter_name 和 parameter_value 传递给 updateOrCreate 函数来创建它

foreach ($parameters_from_request as $parameter) 
        $user->parameters()
                ->updateOrCreate(
                 [
                 'name' => $parameter['name] ,
                 'user_id' => $user->id
                 ],[
                   'name' => $parameter['name'],
                   'value'=> $parameter['value']
                   ]);

【讨论】:

但是我不会有同样的问题吗?如何访问参数名称,如“$user->parameters->name”?参数仍然是一个雄辩的模型数组,因为一个用户有很多参数。即使使用像 $par = UserParameter::where('user_id', $user->id) 这样的单独查询,我也会得到一个数组,所以我不能使用 ['name' => $par->name] 啊,是的!我的错。我已经有了名字。是的,这似乎是正确的。我稍后会测试它,因为我现在不在 PC 上。谢谢! 那很好,我会等待你的认可,别忘了给答案点赞 ;)

以上是关于Laravel updateOrCreate 与 hasMany 关系的主要内容,如果未能解决你的问题,请参考以下文章

updateOrCreate 在 laravel 中导致 ErrorException

updateOrCreate - Laravel 中的批量分配异常

PHP Laravel,方法 updateOrCreate 的替换

我们可以将模型传递给雄辩的Laravel的updateOrCreate方法吗?

在 Laravel 中使用 updateOrCreate 进行多数据插入

Laravel:使用同步或 updateOrCreate 更新父表和子表?