【问题标题】:Laravel relationships hasMany updateOrCreate arrayLaravel 关系有很多更新或创建数组
【发布时间】:2020-02-28 07:29:57
【问题描述】:

我有 User 模型,它与 hasManyUserPosition eloquent 模型有关系:

用户模型

public function positions()
{
    return $this->hasMany(UserPosition::class);
}

当请求来自array的数据位置时,我如何使用updateOrCreate方法?

代码

$positions = [
    "doctor",
    "developer"
];

$user->positions()->each(function($position) use ($positions, $user) {
    $id = $user->id;
    foreach ($positions as $name) {
        $position->updateOrCreate(['user_id' => $id, 'name' => $name], [
            'name' => $name
        ]);
    }
});

注意:在本例中用户在数据库表中没有任何位置

但我的代码不起作用。为什么?

【问题讨论】:

    标签: php laravel eloquent relationship


    【解决方案1】:

    您正在对用户的现有位置进行迭代,这意味着如果用户没有位置,则迭代将永远不会发生。你可以沿着你需要做的位置迭代:

    $positions = collect([
        "doctor",
        "developer"
    ]);
    
    $positions->each(function($position) use ($user) {
            $user->positions()->updateOrCreate(['name' => $position], [
                'name' => $position
            ]);
        }
    });
    

    【讨论】:

    • 您是在不循环的情况下执行此操作吗?我认为这里的$nameundefined,对吗?在你的情况下,我必须用 $position 替换 var $name 吗? @apokryfos
    • 是的,你是对的。仍在进行循环,但已结束 $positions 集合
    • 我不明白为什么这是一个例外的答案,updateOrCreate() 不会在模型集合上工作,$user->positions() 正在返回一个集合,为了让这个工作你必须使用firstOrCreate() 直接在 Position 模型类上,就像我在下面的答案中定义的那样。
    【解决方案2】:

    它不起作用,因为您在每次迭代中运行 updateOrCreate() 方法,该方法永远不会运行,因为正如您在注释中所述“此示例用户在数据库表上没有任何位置”

    在这里,您尝试遍历附加到用户模型的当前现有职位:

    $user->positions()->each()
    

    但这不会运行,因为用户目前没有任何职位。

    我猜您正在尝试更新用户的职位,用户可能已经拥有一个或多个与他相关联的职位并且您不想创建重复项,因为您可以这样做这个:

    $positions = [
        "doctor",
        "developer"
    ];
    
    foreach($positions as $position) {
        UserPosition::firstOrCreate(['user_id' => $user->id, 'name' => $position]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2014-07-10
      • 2015-08-05
      • 2016-10-12
      相关资源
      最近更新 更多