Laravel雄辩的嵌套查询

Ash*_*osh 5 relationship laravel eloquent

我在与Laravel合作时陷入了困境。我有以下型号:

  • 类别
  • 产品
  • 分类产品

CategoryProduct 保存有关哪个产品属于哪个类别的信息(一个产品可能属于多个类别)。

现在,当我想加载属于特定类别的所有产品时,我需要在上面运行查询ProductCategoryProduct 这就是我遇到的问题。

我尝试了以下方法,但未成功:

$products = Product::where('status', '=', 'active')
->where('category_id', '=', $category_id)
->take($count)
->skip($skip)
->get();
Run Code Online (Sandbox Code Playgroud)

显然,它将说category_id不是一列。

这是我的数据库和模型结构:

类别表

ID,名称等

产品表

ID,名称,SKU等

category_products表

id,product_id,(Product.id的外键)category_id,(Category.id的外键)等。

产品型号

class Product extends Eloquent {

protected $table = 'products';

protected $hidden = array();

    public static $rules = array('name' => 'required|min:3');

}
Run Code Online (Sandbox Code Playgroud)

类别模型

class Category extends Eloquent {

protected $table = 'categories';

public static $rules = array('name' => 'required|min:3');

}
Run Code Online (Sandbox Code Playgroud)

分类产品型号

<?php

class CategoryProduct extends Eloquent {

protected $table = 'category_products';

public function product()
{
    return $this->belongsTo('Product');
}

public function category()
{
    return $this->belongsTo('Category');
}
}
Run Code Online (Sandbox Code Playgroud)

更新资料

一个新的问题

我正在尝试展示产品。如果未传递类别(值是-1),则我将显示所有产品,否则将显示传递的类别中的产品。

现在,当我显示所有产品时,这些产品可能已经存在于一个类别中。我要显示类别中已经存在的产品的复选框。我正在做这样的事情:

if($category_id==-1)
        $products = Product::where('status', '=', 'active')->take($count)->skip($skip)->get();
    else{
        $products = Product::whereHas('categories', function($q) use ($category_id)
        {
            $q->where('category_id', $category_id);
        })->where('status', 'active')
            ->take($count)
            ->skip($skip)
            ->get();
    }
Run Code Online (Sandbox Code Playgroud)

category_products具有product_id,category_id作为列。

现在,查询:

$ products = Product :: where('status','=','active')-> take($ count)-> skip($ skip)-> get();

仅从产品表中选择产品。如果我在category_products中检查每个产品是否存在,那么对于大量产品的数据库查询将太多。

任何想法,如何实现这一目标。我希望我能够解决我的情况。谢谢

use*_*496 4

除非除了product_id 和category_id 之外还有指向其他关系的其他字段,否则该CategoryProduct模型不是必需的。

Category所需要的是在和模型上建立关系的方法Product

在 中Category,添加关系函数...

public function products()
{
    return $this->belongsToMany('Product', 'category_products');
}
Run Code Online (Sandbox Code Playgroud)

在您的Product模型中,对类别执行相同的操作。

public function categories()
{
    return $this->belongsToMany('Category', 'category_products');
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用关系方法查询属于该类别的活跃产品,并whereHas()

$products = Product::whereHas('categories', function($q) use ($category_id)
{
    $q->where('id', $category_id);
})->where('status', 'active')
->take($count)
->skip($skip)
->get();
Run Code Online (Sandbox Code Playgroud)