Eloquent Laravel извлекает данные из нескольких таблиц

Я потратил два дня, пытаясь решить эту проблему, но я не могу понять, как это сделать.

у меня пять столов

  • Товар
  • Категория
  • Категория_Продукт
  • Заказ
  • Заказ_Продукт

С точки зрения, нажав кнопку категории, я должен получить все заказанные товары с соответствующей категорией.

У меня актуальные модели:

Модель продукта

class Product extends Model
{
    public function categories() {
        return $this->belongsToMany('App\Category');
    }

    public function orders() {
        return $this->belongsTo('App\Order');
    }
}

Модель категорий

public function products() {
    return $this->belongsToMany('App\Product');
}

Модель заказа

public function products() {
    return $this->belongsToMany('App\Product');
}

Теперь проблема в том, что я не могу понять, как получить данные из текущих таблиц. Когда я нажимаю кнопку, я могу получить категорию из таблицы Product, но я хочу получить из Ordered_Products. Я действительно не могу понять, как.

Благодаря этому я могу получить все категории из продукта.

if (request()->category) {
    $products = Product::with('categories')->whereHas('categories', function ($query) {
        $query->where('slug', request()->category);
    })->get();
}

Вместо этого я могу получить заказанные продукты.

$products = DB::table('order_product')
    ->join('products', 'order_product.product_id','=', 'products.id')
    ->where('order_product.user_id','=',$user_id)
    ->get();

Для последнего есть лучший способ сделать это, это точно. Извините, если это глупый вопрос, но я новичок в этой структуре. Я использую Laravel 7.2.


person Kuze    schedule 19.04.2020    source источник


Ответы (2)


В основном Eloquent Model не поощряет объединение таблиц для получения данных. К нему следует присоединяться только для фильтрации результатов (поэтому вам нужно удалить поле другой таблицы, используя ->select('original_table.*'))

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

e.g.

$categories = Category::query()
    ->with('products')
    ->where('slug', request('category'))
    ->get();
$products = $categories->flatMap->products;
$pivots = $products->map->pivot;
person mpyw    schedule 19.04.2020

Решено с помощью whereHas два раза:

$products = Product::with('categories')->whereHas('categories',function($query){
                $query->where('slug',request()->category);
            })->whereHas('orders',function($query){
                $query->where('orders.user_id',Auth::id());
            })->get();
person Kuze    schedule 22.04.2020