Php 如何在多对多关系的laravel pivot表中停止自动排序

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检索用户 但是,在标准透视表中,主键由两列组成,在您的例

我有一个author表和一个publication表。两者都以多对多的关系相互关联。插入出版物时,出版物的作者将按作者id的顺序插入透视表。但我需要按在前端选择作者的顺序插入。无论前端中作者的顺序是什么,它都是按透视表中作者的id排序的。如何停止这种自动排序

您不能将特定顺序的行添加到透视表中,因为这样做没有实际意义

让我们考虑一个用户表:

  • 您输入的第一个用户的id为1
  • 第二个将分配给id 2
  • 等等
  • 因此,您可以按特定顺序输入用户,并按其id检索用户

    但是,在标准透视表中,主键由两列组成,在您的例子中是author_id和publication_id。这里没有创建任何新内容,您只需将两个不同表中两个现有行的主键关联起来,以实现一个唯一的组合主键

    如果我解释得很好(我希望如此:p),你应该理解为什么这么说

    但是我需要按照我在前端选择作者的顺序插入它

    没什么意义

    但是,别担心,在这里实现你的目标还是有可能的

    您可以使用具有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();
    
    我希望有帮助