Eloquent Laravel 从多个表中获取数据

Eloquent Laravel Fetch Data from multiple tables

我花了两天时间试图解决这个问题,但我不知道如何解决。

我有五张桌子

从视图中,单击类别按钮我必须获取他订购的所有具有相关类别的产品。

我有当前型号:

产品型号

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');
}

现在的问题是我不知道如何从当前 tables.When 中获取数据 我按下一个按钮 我可以从 Product [=63] 中获取类别=],但我想从 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.

基本上 Eloquent 模型不鼓励加入 table 来检索数据。它应该仅用于过滤结果(因此您需要使用 ->select('original_table.*') 删除其他 table 的字段)

在这种情况下,您应该首先简单地检索 categories。然后使用关系属性访问检索相关数据。

例如

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

使用 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();