为什么 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 - Collections - Available Methods mapWithKeys
这个效果很好。
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 - Collections - Available Methods mapWithKeys