Eloquent Laravel Выборка данных из нескольких таблиц - PullRequest
0 голосов
/ 19 апреля 2020

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

У меня есть пять таблиц

  • Продукт
  • Категория
  • Category_Product
  • Order
  • 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.

Ответы [ 2 ]

0 голосов
/ 22 апреля 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();
0 голосов
/ 19 апреля 2020

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

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

например

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