Php 如何在多对多关系的laravel pivot表中停止自动排序
我有一个author表和一个publication表。两者都以多对多的关系相互关联。插入出版物时,出版物的作者将按作者id的顺序插入透视表。但我需要按在前端选择作者的顺序插入。无论前端中作者的顺序是什么,它都是按透视表中作者的id排序的。如何停止这种自动排序您不能将特定顺序的行添加到透视表中,因为这样做没有实际意义Php 如何在多对多关系的laravel pivot表中停止自动排序,php,laravel,many-to-many,pivot-table,Php,Laravel,Many To Many,Pivot Table,我有一个author表和一个publication表。两者都以多对多的关系相互关联。插入出版物时,出版物的作者将按作者id的顺序插入透视表。但我需要按在前端选择作者的顺序插入。无论前端中作者的顺序是什么,它都是按透视表中作者的id排序的。如何停止这种自动排序您不能将特定顺序的行添加到透视表中,因为这样做没有实际意义 让我们考虑一个用户表: 您输入的第一个用户的id为1 第二个将分配给id 2 等等 因此,您可以按特定顺序输入用户,并按其id检索用户 但是,在标准透视表中,主键由两列组成,在您的例
让我们考虑一个用户表:
位置的列
。对于插入的每个作者,此列可以递增。然后,您可以按照position列对表进行排序,只需将->orderBy('position')
添加到您的关系或需要查询的每个查询中即可
下面是一个例子来说明我上面所说的:
foreach($authors as $position => $author)
{
$publication->authors()->attach($author, ['position' => $position]);
}
如果$authors
按照您在前端选择作者的顺序包含作者,则会相应地添加这些作者
如果您需要sync
而不是attach
,也可以这样做,只需稍微详细一点:
$syncData = $authors->mapWithKeys(function($author, $position){
return [$author->id => ['position' => $position]];
});
$publication->authors()->sync($syncData);
不要忘记,您可以添加false
作为sync
方法的第二个参数,这样它只会添加新作者
之后,只需在发布模型中更改您的作者关系,如下所示:
public function authors(){
return $this->belongsToMany(Author::class)->orderBy('position');
}
或者您需要的任何地方:
$publication->authors()->orderBy('position')->get();
我希望有帮助