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

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

  • Продукт
  • категория
  • Category_Product
  • порядок
  • Order_Product

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

У меня есть текущие модели:

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

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.

0
Kuze 19 Апр 2020 в 17:38

2 ответа

Лучший ответ

Решено с помощью 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();
0
Kuze 22 Апр 2020 в 17:58

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

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

Например

$categories = Category::query()
    ->with('products')
    ->where('slug', request('category'))
    ->get();
$products = $categories->flatMap->products;
$pivots = $products->map->pivot;
0
mpyw 19 Апр 2020 в 16:05