Laravel eloquent - Фильтрация подзапроса с помощью оператора - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующий запрос:

 $countries = Country::where('code', '=', $code)
 ->with(array('cities.details' => function ($query) use ($user) {
 $query->where('cities.name', '=', 'This is a city name');
 }))->first();

Давайте рассмотрим пример: у меня есть три таблицы, Страна , Город и CityDetails .Я хочу получить все страны, затем получить все города (ВКЛЮЧАЯ информацию о деталях), но я также хочу, чтобы отфильтровывал города по имени и , выбирая таблицу сведений, которая принадлежит таблице города e.

Если я хочу использовать с, чтобы получить дочернюю и другую таблицу, используя with(cities.details), как я могу фильтровать, используя атрибуты CITIES?

Основной вопрос: как я могу получить две таблицы вa с оператором типа secondTable.OtherTable и фильтрацией запроса с использованием secondTable атрибутов?

Просто для большей ясности, если я использую операторы следующим образом:

  $countries = Country::where('code', '=', $code)
 ->with(array('cities.details' => function ($query) use ($user) {
    $query->where('name', '=', 'This is a detail name');
    }))->first();

Я могу получить доступ только подробности атрибуты таблицы.Вопрос заключается в следующем: как получить доступ к атрибуту таблицы городов для фильтрации внутри оператора?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Самый простой - использовать запрос на соединение:

(new Country)
    ->join('cities', 'cities.id', '=', 'countries.city_id')
    ->join('city_details', 'cities.id', '=', 'city_details.city_id')
    ->where('cities.name', 'TheName')
    ->where('city_details.info', 'info')
    ->select('...');

Но результат имеет только один уровень.Итак,

$query = (new Models\Country())
    ->with([
        'cities' => function ($query) {
            $query->where('name', 'xxx')->with([
                'details' => function ($query) {
                    $query->where('info', 'info');
                }
            ]);
        }
    ]);

$result = $query->get()->filter(function ($item) {
    return count($item['cities']);
});

Результат дает страны с пустыми городами.Так что используйте коллекцию Laravel для фильтрации в последнем.

0 голосов
/ 21 февраля 2019

Я только что нашел решение.По сути, я должен применить фильтр для таблицы городов, а затем вызвать функцию wit в подзапросе.Этот код решил мою проблему:

    $countries = Country::where('code', '=', $code)
 ->with(array('cities' => function ($query) use ($user) {
    $query->where('name', '=', 'San Francisco')->with('details');
    }))->first();

Обратите внимание, что я вызвал с ('детали') для города только после фильтрации в подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...