如何使用 Attach 创建新的多对多记录

Ale*_*eix 1 many-to-many record attachment eloquent laravel-5

好吧,我看到了一些关于此的帖子,但我根本不理解附加的概念,我有三个表:

Llistes(列表):

        $table->increments('id');
        $table->string('nom_llista');
        $table->integer('user_id')->unsigned();
    });
Run Code Online (Sandbox Code Playgroud)

康康斯(歌曲):

        $table->increments('id');
        $table->string('titol');
        $table->integer('genere_id')->unsigned();
        $table->integer('artista_id')->unsigned();
        $table->integer('album_id')->unsigned();
Run Code Online (Sandbox Code Playgroud)

数据透视表:llistes_cancons ( lists_songs)

        $table->increments('id');
        $table->integer('id_canco')->unsigned();
        $table->integer('id_llista')->unsigned();
        $table->timestamps();
Run Code Online (Sandbox Code Playgroud)

我还有另外两个课程,我认为这是正确的,但我不确定:

在 Canco.php ( Song.php ) 中:

public function llistescancons_llistes()
{
    return $this->belongsToMany('App\Llista');
}
Run Code Online (Sandbox Code Playgroud)

在 Llista.php ( List.php ) 中:

public function llistescancons_cancons()
{
    return $this->belongsToMany('App\Canco');
}
Run Code Online (Sandbox Code Playgroud)

所以,问题是我如何在我的控制器中实现一个功能,让我可以将新记录添加到数据透视表(多对多),并且如果可能有另一个功能来显示记录,我是 Laravel 的新手,这有点对我来说很难。

sal*_*mas 6

无需实现从数据透视表中添加/删除记录的方法。雄辩有attach/detach方法可以为您做到这一点,但首先您需要为 Eloquent 提供数据透视表的列名称,因为您没有使用 Eloquent 的列名称约定。

在 Canco.php (Song.php) 中:

public function llistescancons_llistes()
{
    return $this->belongsToMany('App\Llista','llistes_cancons','id_canco','id_llista');
}
Run Code Online (Sandbox Code Playgroud)

在 Llista.php (List.php) 中:

public function llistescancons_cancons()
{
    return $this->belongsToMany('App\Canco','llistes_cancons','id_llista','id_canco');
}
Run Code Online (Sandbox Code Playgroud)

然后,如果您想将一首歌曲附加到列表中,您可以轻松地使用该歌曲id来做到这一点

$list = App\Llista::find(1);
$list->llistescancons_cancons()->attach($songId);
Run Code Online (Sandbox Code Playgroud)

或者反过来

$song = App\Canco::find(1);
$song->llistescancons_llistes()->attach($listId);
Run Code Online (Sandbox Code Playgroud)