如何在Laravel Eloquent ORM中基于多对多关系从数据库获取数据

时间:2020-01-15 14:01:21

标签: laravel

我有两个模型:

class Musician extends Model
{
    public function instruments()
    {
        return $this->belongsToMany('App\Instrument', 'musicians_instruments');
    }

}

class Instrument extends Model
{
    public function musicians()
    {
        return $this->belongsToMany('App\Musician', 'musicians_instruments');

    }
}

保存到数据库可以正常工作,就像我想要的那样。我的数据库中有3个表:

musicians
instruments
musicians_instruments (pivot table)

仪器-示例内容:

id   name
1    guitar
2    piano
3    keyboard
4    DJ

当音乐家注册时,他可以从1到3种乐器中进行选择。 例如,当他在数据透视表中选择吉他(1)和键盘(3)时(假设音乐家的ID为2):

musicians_instruments

musician_id   instrument_id
2             1
2             3

我的问题是-请帮助我如何编写查询以获取音乐家演奏的所有乐器。 如果Joe选择1、3,则如何选择他选择的所有乐器名称。

下方-MusicianController:


namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Musician;

use Illuminate\Support\Facades\Hash;

class MusicianController extends Controller
{

    public function index()
    {
        $musicians = Musician::all(); // it's for other musicians data


        $musician = Musician::with('instruments')->find($musician_id);

        return view('musicians', compact('musicians', 'musician'));
    }

2 个答案:

答案 0 :(得分:0)

您只需使用在各个模型中定义的方法,即可为每个音乐家获取乐器:

$musician = App\Musician::find($musician_id);

$instruments = $musician->instruments()->get();

foreach($instruments as $instrument) {
    // $instrument->name;
}

答案 1 :(得分:0)

对于索引页(所有音乐家及其乐器的列表):

在您的控制器中,使用以下代码:

public function index()
{
    $musicians = App\Musician::with('instruments')->get();
    return view('musicians', compact('musicians', 'musicians'));
}

在您的视图中,使用以下代码:

 @foreach($musicians as $musician)
    {{ $musician->name; }}
    <ul>
      @foreach ($musician->instruments as $instrument)
        <li>{{ $instrument->name }}<br></li>
      @endforeach
    </ul>
 @endforeach

对于个人资料页面(特定音乐家[id = artist_id]及其乐器的页面):

在您的控制器中,使用以下代码:

$musician = App\Musician::where("id",$musician_id)->with('instruments')->first();
return view('your/view/file', ['musician'=> $musician]);

在您的视图中,使用以下代码:

{{ $musician->name }}
@foreach($musician->instruments as $instrument)
    {{ $instrument->name; }}<br>
@endforeach

有关更多详细信息,请访问:https://laravel.com/docs/6.x/eloquent-relationships