Answer the question
In order to leave comments, you need to log in
How to make a selection from a database with relationships and apply filters?
There are 2 tables in the database:
1) cars - stores car records:
id | manufacturer | model | description ...
2) cars_prices_history - stores the history of car prices (the price may be promotional, or it may not be promotional)
id | car_id | price | is_sale | sale_expires | date |
-------------------------------------------------------------------------
1 | 1 | 23000 | 1 | 27-08-2021 | 27-04-2020 |
-------------------------------------------------------------------------
2 | 1 | 34000 | 0 | NULL | 27-04-2020 |
-------------------------------------------------------------------------
3 | 2 | 27500 | 0 | NULL | 28-04-2020 |
class Car extends Model
{
protected $table = 'cars';
public function priceHistory() {
return $this->hasMany(Car_price_history::class);
}
}
class Car_price_history extends Model
{
protected $table = 'cars_prices_history';
public function car() {
return $this->belongsTo(Car::class);
}
}
public function index(Request $request, Car $cars)
{
$cars = Car::with('priceHistory'); // получаю билдер
if ($request->has('minPrice') && !empty($request->minPrice))
{
// здесь должен быть фильтр, который должен через модель Car_price_history
// сходить к БД, найти все цены, у которых car_id будет равно id-шнику авто (непонятно, откуда
// брать id авто, если в $cars сидит билдер, а коллекцию я получить не могу до запроса,
// а даже если получу, то мне придётся запускать foreach для каждого авто и перелопачивать всю коллекцию??
// или делать это при помощи методов коллекций, но всё равно выглядит странно), взять последнюю
// акционную цену, а если акционной нет, то взять последнюю не акционную. И только потом, получив цену,
// применить фильтр, который отсеит авто. И такая логика для каждого фильтра.
$cars->where('price', '>=', $request->minPrice); // не работающий фильтр
}
$cars = $cars->get(); // получаю коллекцию
return new CarCollection($cars);
}
price
andsale_price
? But in addition to cars_prices_history, I also have tables that are related to the Car model, and adding columns, firstly, will cause data to be duplicated, and secondly, it violates the table normalization rules, that is, the idea is strange too. Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question