Laravel Eloquent如何将所有产品都装入slug类别

时间:2016-12-27 09:31:49

标签: laravel eloquent

我的Productcategory.php有

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

而Product.php有

public function productcategory()
{
    return $this->belongsTo('App\Models\Productcategory', 'category_id');
}

现在我的路线是

Route::get('gallery/{slug}', 'GalleryController@index');

当网址类似于gallery/print-pattern-client-work时,如何才能获得具有相同类别的所有产品?我有以下内容,但category_id是一个整数而不是一个slug。所以我不太确定该怎么做。

public function index()
{
    $categoryslug = Request::segment(2);
    $products = Productcategory::with('products')->where('category_id',$categoryslug)->get();
...
}

3 个答案:

答案 0 :(得分:5)

这假设您有一个名为" slug"的列。在您的product_categories表中。并且您描述的关系运作良好。

您可以在Product.php中创建一个访问者

public function scopeFindByCategorySlug($query, $categorySlug)
{
    return $query->whereHas('productcategory', function ($query) use ($categorySlug) {
        $query->where('slug', $categorySlug);
    });
}

然后在你的控制器中你打电话给:

public function index(Request $request, $slug)
{
    $products = Product::findByCategorySlug($slug)->get();
}

编辑:

如评论中所述,实际上并不需要访问者。这基本上就是你所需要的(在控制器中):

public function index(Request $request, $slug)
{
    $products = Product::whereHas('productcategory', function ($query) use ($categorySlug) {
        $query->where('slug', $categorySlug);
    })->get();
}

答案 1 :(得分:1)

不要

$categoryslug = Request::segment(2);

使用$slug

public function index($slug)
{
    $products = Productcategory::with('products')->where('category_id',$slug)->get();
...
}

答案 2 :(得分:0)

当你使用Laravel时,你应该像这样使用Laravel的Many to Many Relationships

您的表格结构如下:

- products
    - id
    - name
    - ...

- categories
    - id
    - name
    - slug
    - ...

- category_product
    - id
    - category_id
    - product_id
    - ...

你的模特应该是这样的:

class Product extends Model {

    public function categories() {
        $this->belongsToMany(Category::class, 'category_product');
    }

}

class Category extends Model {

    public function products() {
        $this->belongsToMany(Product::class, 'category_product');
    }

}

您可以像这样获取特定$category_slug的所有产品:

$category = Category::where('slug', $category_slug)->first();
if($category) {
    $products = $category->products;
}