为什么 laravel 7 pivot with sync 不起作用?

Why laravel 7 pivot with sync don't working?

这个效果很好。

    if ($request->link) {
        foreach($request->name as $key => $social){
            $stall->socials()->attach($social, ['value' => $request->link[$key] ?? null]);
        }
    }

但是不行。

    if ($request->link) {
        foreach($request->name as $key => $social){
            $stall->socials()->sync($social, ['value' => $request->link[$key] ?? null]);
        }
    }

Stall.php

public function socials()
{
    return $this->belongsToMany(Social::class)->withPivot('value');
}

问题是它在更新期间根本不存储在数据库中。

您需要以特定方式构建列表,以便在同步时在数据透视表 table 上设置其他字段。这将是一个关联数组,其中键是 id,值是一个关联数组,其中键是字段,值是要在数据透视字段上设置的值。

您可以使用集合以您需要的方式创建列表:

if ($request->link) {
    $stall->socials()->sync(collect($request->name)->mapWithKeys(
        fn ($value, $key) => [$value => ['value' => $request->link[$key] ?? null]]
    ));
}

如果您不使用 PHP 8 那么您可以调整为常规匿名函数而不是短箭头语法:

function ($value, $key) use ($request) { return [$value => ['value' => $request->link[$key] ?? null]]; }

Laravel 7.x Docs - Eloquent - Relationships - Inserting & Updating Related Models - Many To Many Relationships - Syncing Associations sync

Laravel 7.x Docs - Collections - Available Methods mapWithKeys