Laravel - фильтровать записи по различным отношениям - PullRequest
0 голосов
/ 06 июля 2018

Прямо сейчас у меня есть следующая структура моделей,

Country -> State -> City -> Student

И модель Student включает first_name и last_name.

Итак, я хочу, чтобы страны были отфильтрованы, указав имя студента. Например, если я даю John, тогда я хочу получить список стран, в которых есть студенты, чье имя John.

Я пытался что-то вроде этого,

Я добавил метод с именем Students() в Country модель и возвращал Student экземпляров этого метода. Но теперь я попробую выяснить, как фильтровать страны.

Спасибо в ожидании.

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

в модели ученика создайте это:

public function city()
    {
        return $this->belongsTo(City::class,'city_id', 'id');
    }

и в модели города создайте это:

public function state()
    {
        return $this->belongsTo(State::class,'state_id', 'id');
    }

Наконец-то в государственной модели:

public function country()
    {
        return $this->belongsTo(Country::class,'country_id', 'id');
    }

Например, если вы сделали такие вещи в контроллере:

$students = Student::where('name', 'John')->get();

в представлении:

@foreach($students as $student)
$student->city->state->country->country_name;
@endforeach

Вы можете получить доступ таким образом.

0 голосов
/ 06 июля 2018

Если вы правильно настроили модель и отношения, вам нужно вызвать их с помощью функции

$students = Student::where('name','John')->with('city.state.country')->get();

Цикл по $students

@foreach($students as $student)
     {{ $student->city->state->country }}
@endif
0 голосов
/ 06 июля 2018

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

Сначала мы опрашиваем всех пользователей с помощью first_name == John, как вы описали, и мы ограничиваем запрос выводом только идентификаторов.

$users = User::where('first_name', 'John')->get()->pluck('id');

Затем мы сопоставим это с результатом Students() из модели страны. Поскольку я не знаю, к чему вы обращаетесь, чтобы получить страну, которую вы хотите, я просто возьму пример Нидерландов - вот откуда я.

$users = Country::where('name', 'the Netherlands')->students()->whereIn('id', $users)->get();

Чтобы это работало, вы должны убедиться, что в функции Students() в вашей модели get() опущено.

Окончательный «результат»:

$users = User::where('first_name', 'John')->get()->pluck('id');
$users = Country::where('name', 'the Netherlands')->students()->whereIn('id', $users)->get();
...