Laravel – фильтрация записей по определенному отношению

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

Country -> State -> City -> Student

А модель Student включает в себя first_name и last_name.

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

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

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

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


person Community    schedule 06.07.2018    source источник
comment
Возможный дубликат: stackoverflow.com /вопросы/46342275/   -  person Oluwatobi Samuel Omisakin    schedule 06.07.2018
comment
в вашей студенческой таблице есть country_id или city_id?   -  person DsRaj    schedule 06.07.2018
comment
@DsRaj Только city_id   -  person    schedule 06.07.2018
comment
Хорошо, и вам нужен список стран студента, чье имя начинается с Джона. Допустим: Имя: Джон Дарк Страна: Великобритания, Имя: Джон Дью Страна: США, верно   -  person DsRaj    schedule 06.07.2018
comment
@DsRaj Да, верно   -  person    schedule 06.07.2018
comment
@GauravDeshpande проверьте ответ   -  person DsRaj    schedule 06.07.2018


Ответы (3)


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

Сначала мы опрашиваем всех пользователей с 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();
person Thierry Maasdam    schedule 06.07.2018
comment
Я сделал то же, что и вы, но выдает исключение BadMethodCallException, Method Illuminate\Database\Query\Builder::students does not exist. - person ; 06.07.2018
comment
Не могли бы вы показать мне метод Students(), который вы создали для модели вашей страны? (Ссылаясь на то, что вы сказали здесь: я добавил метод под названием «Студенты ()» в модель «Страна» и возвращаю экземпляры «Студенты» из этого метода.) - person Thierry Maasdam; 06.07.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

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

person Ali Özen    schedule 06.07.2018

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

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

Цикл через $students

@foreach($students as $student)
     {{ $student->city->state->country }}
@endif
person DsRaj    schedule 06.07.2018