Как использовать eloquent для сравнения столбца со связанным столбцом таблицы - PullRequest
0 голосов
/ 14 октября 2019

Допустим, у вас есть страница результатов поиска, которая может отображать автомобили по ряду критериев, включая год выпуска.

Когда пользователь не указывает год, я хочу вытащить все автомобили ("year_models") с последнего доступного года в каждой марке. Например, вы бы увидели Chevys 2019 года, но Pontiacs 2009 года. В каждой таблице брендов у меня есть столбец «latest_year», который можно использовать для этого.

Отношения:

  • бренды (например, Chevrolet, Ford и др.)
  • - brand_models (Corvette, Silverado и др.)
  • ---- year_models (например, Corvette 2019)

У каждой марки есть много brand_models. У каждой модели бренда есть много year_models.

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

$year = $request['year'];

$yearModels = YearModel::with([
    'brandModel',
    'brandModel.brand',
])
->when(!$year, function ($q) {
    $q->whereHas('brandModel.brand', function ($q) use ($year) {
        $q->where('latest_year', $YEARMODEL_YEAR?? );
    });
})
...

Я также попытался выполнить запрос «wherecolumn», но не думаю, что смогу запросить отношение к бренду таким образом.

Ответы [ 2 ]

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

Подумайте, как бы вы написали этот запрос простым SQL, возможно, он должен выглядеть примерно так:

SELECT b.brand, bm.model, ym.year from brands b
left join brand_models bm on b.id = bm.brand_id
left join year_models ym on ym.model_id = bm.model_id
group by b.brand, bm.model, ym.year having ym.year = max(ym.year)

Затем попробуйте преобразовать его в красноречивый.

$brands = Brands::with(["brandModel", "brandModel.yearModel")
    ->groupBy("id, brandModel.id, brandModel.yearModel.id");

if(!isset($year)){
    $brands = $brands->having("brand.yearModel.year", "=", \DB::raw("max(brandModel.yearModel.year)"));
} else {
    $brands = $brands->having("brand.yearModel.year", "=", $year);
}

$results = $brands->get();
0 голосов
/ 14 октября 2019

Я думаю, вы думаете о том, чтобы сделать что-то вроде

$query = YearModel::with([
                'brandModel',
                'brandModel.brand',
            ]
        );
if (!$year) {
    $query = $query->whereRaw('column_one', 'column_2');
}

$result = $query->get();

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

Пример в тинкере

>>> App\models\Student::whereRaw('standard_id', 'section_id')->get()
=> Illuminate\Database\Eloquent\Collection {#3225
     all: [
       App\models\Student {#3226
         id: 1,
         first_name: "Farhan",
         last_name: "Pasha",
         gender: "m",
         date_of_birth: "2001-02-02",
         roll_number: 1,
         standard_id: 1,
         section_id: 1,
         school_id: 1,
         photo: "",
         created_at: "2019-10-07 07:36:21",
         updated_at: "2019-10-10 10:42:37",
       },
       App\models\Student {#3213
         id: 2,
         first_name: "Mohameed",
         last_name: "Khalil",
         gender: "m",
         date_of_birth: "2013-05-27",
         roll_number: 2,
         standard_id: 1,
         section_id: 1,
         user_id: 1,
         school_id: 1,
         photo: "",
         created_at: "2019-10-14 07:15:10",
         updated_at: "2019-10-14 07:15:10",
       },
     ],
   }
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...