@kamilqiyasov

Как сделать запрос с использованием 3 таблиц на Laravel?

Есть 3 класса:

class Brand extends Model
{
    protected $table = 'brands';

    public function categories()
    {
        return $this->hasMany(Category::class);
    }

    public function products()
    {
        return $this->hasManyThrough(Product::class, Category::class);
    }
}

class Category extends Model
{
    protected $table = 'categories';

    public function brand()
    {
        return $this->belongsTo(Brand::class);
    }

    public function products()
    {
        return $this->hasMany(Product::class);
    }

}

class Product extends Model
{
    protected $table = 'products';

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function brand()
    {
        return $this->belongsTo(Brand::class);
    }
}


Я объединил их, все замечательно, но как мне сделать запрос с объединением этих трех таблиц. Чтобы одним запросом я тянул все 3 таблицы и + добавил пару условий.
Проблема такая:
На странице мне нужно вывести продукты с категорией чпу которого равен remkomplekty и c брендом чпу = aro

На SQL я делаю так:
SELECT p.*
FROM products p, categories c, brands b
WHERE p.category_id = c.id 
AND c.slug = 'remkomplekty' 
AND c.brand_id = b.id
AND b.slug = 'aro'
ORDER BY quantity DESC, CODE


Подскажите, какой будет логичный и красивый код контроллера на "Языке Laravel".

Варианты с DB::table, DB::select не катят.
  • Вопрос задан
  • 913 просмотров
Пригласить эксперта
Ответы на вопрос 3
Fragster
@Fragster
помогло? отметь решением!
Одним не получится, а вот по одному запросу на таблицу - да https://laravel.com/docs/5.8/eloquent-relationship...
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
Попробуйте через with как это описано в Eager Loading: Eager Loading Multiple Relationships
Ответ написан
@kamilqiyasov Автор вопроса
$products = Product::whereHas('category', function ($query) use ($categorySlug, $brandSlug) {
            $query->whereHas('brand', function ($query) use ($brandSlug) {
                $query->where('slug', $brandSlug);
            });
            $query->where('slug', $categorySlug);
        })
            ->orderBy('quantity', 'DESC')
            ->orderBy('code')
            ->get();


Есть такой код, но при $products->category он делает новый запрос
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы