Как получить данные из базы данных на основе отношения «многие ко многим» в Laravel Eloquent ORM - PullRequest
0 голосов
/ 15 января 2020

У меня есть две модели:

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) в сводной таблице, мы имеем (допустим, у музыканта есть идентификатор 2):

musicians_instruments

musician_id   instrument_id
2             1
2             3

Мой вопрос - пожалуйста, помогите мне, как написать запрос, чтобы получить все инструменты, на которых играет музыкант. Если Джо выберет 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 голосов
/ 15 января 2020

Для Главная страница (Список всех музыкантов с их инструментами):

В вашем контроллере используйте следующие коды:

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 = musician_id] с их инструментами):

В вашем контроллере используйте эти коды:

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

В вашем View используйте эти коды:

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

Для более подробной информации посетите: https://laravel.com/docs/6.x/eloquent-relationships

0 голосов
/ 15 января 2020

Вы можете получить инструменты для каждого музыканта, просто используя методы, которые вы определили в соответствующих моделях:

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

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

foreach($instruments as $instrument) {
    // $instrument->name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...