Получите фильтрацию моделей Laravel по многим отношениям - PullRequest
0 голосов
/ 14 октября 2018

У меня есть схема базы данных фильмов (только данные, относящиеся к вопросу):

<strong>persons</strong> <em>(yes, I used "persons" instead of "people"...)</em>
id
name

<strong>roles</strong>
id
name

<strong>roles_persons</strong>
person_id
role_id

И соответствующие модели, определяющие отношение многие ко многим:

class Person extends Model
{
    protected $table = 'persons';

    public function roles(){
        return $this->belongsToMany('App\Role', 'roles_persons')->withTimestamps();
    }
}

class Role extends Model
{
    public function persons(){
        return $this->belongsToMany('App\Person', 'roles_persons')->withTimestamps();
    }
}

Все хорошопока что.

Одна из ролей - «директор».

Теперь я хочу добавить таблицу «Фильмы», которая имеет внешний ключ с идентификатором директора (человека сроль "директора").

<strong>films</strong>
id
title
director_person_id

В методе создания FilmsController я пытаюсь отправить в представление список с директорами (для отображения выбранного входа, чтобы выбрать один).

Какой правильный способ сделать это?

class FilmsController extends Controller
{
    public function create()
    {
        $directorRole = Role::find('1');

        $directorsToChoose = Person::  ???

        return view('films.create')->with('directors', $directors);
    }
}

Я видел этот связанный вопрос , но я не понимаю, как его применить в этом случае.

Спасибо.

1 Ответ

0 голосов
/ 14 октября 2018

Не очень удобно использовать ключи сводной таблицы в качестве внешних ключей для другой таблицы.В таких случаях вы можете добавить первичный ключ в таблицу и использовать этот ключ в качестве внешнего ключа.

person_roles
id (первичный ключ)
role_id
person_id

фильмы
id
person_role_id (внешний ключ)

Поскольку это не сводная таблица, также создайте модель Eloquent.

PersonRole

class PersonRole extends Model
{
    protected $table = 'persons_roles';

    public function role()
    {
        return $this->belongsTo(Role::class);
    }

    public function person()
    {
        return $this->belongsTo(Person::class);
    }
}

Person

class Person extends Model
{
    protected $table = 'persons';

    public function personRole
    {
        return $this->hasMany(PersonRole::class);
    }
}

Роль

class Person extends Model
{
    protected $table = 'roles';

    public function personRole
    {
        return $this->hasMany(PersonRole::class);
    }
}

А затем отправьте эти идентификаторы таблиц в форму создания фильмов, чтобы выбрать.

class FilmsController extends Controller
{
    public function create()
    {
        $directors = PersonRole::whereHas('role', function ($roles) {
            $roles->where('name', 'director');
        })
        ->with('person')
        ->get();

        return view('films.create')->with('directors', $directors);
    }
}

Просмотр

<select>
    @foreach($directors as $director)
        <option value="{{ $director->id }}">{{ $director->person->name }}</option>
    @endforeach
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...