Laravel Eloquent:如何根据产品类别和/或产品品牌过滤产品评论?

时间:2015-07-06 05:19:51

标签: php laravel eloquent

我将用更多细节描述这种情况:

我有一个产品列表,其中每个产品属于某个类别和某个品牌。某些产品可以由用户审核。

在我的Laravel应用程序中的/ review /页面上,我有一个评论列表和类别和品牌的选择框以及搜索按钮。

如果用户没有选择类别或品牌,则所有评论都会显示,分页并且很好。

当用户选择类别或品牌或两者并尝试以此方式过滤所有评论时,就会出现问题。

Reviews table fields: ID, user_id(foreign key users.ID), product_id(foreign key products.ID), text
Products table fields: ID, category_id(foreign key categories.ID), brand_id(foreign key brands.ID), name
Categories table fields: ID, name
Brands table fields: ID, name
Users table fields: ID, username

当我列出评论时,我只是使用:

$reviews = Review::orderBy('id', 'DESC')->paginate(5);

如果我想通过user_id过滤评论,那么评论表包含user_id列会很容易 但是,如何按产品类别和/或产品品牌过滤它们?

以下是评论,产品和类别模型:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Review extends Model {
    protected $fillable = [];

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

    public function user() {
        return $this->belongsTo('App\User');
    }
}

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model {

    protected $fillable = [];

    public function user() {
        return $this->belongsTo('App\User');
    }

    public function reviews() {
        return $this->hasMany('App\Review');
    }

    public function category() {
        return $this->belongsTo('App\Category');
    }

}


<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model {
    protected $fillable = [];

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

如果我使用加入,则$ review-&gt; user-&gt; id,$ review-&gt; user-&gt; username,$ review-&gt; id不正确,我正在收到评论.product_id as review-&gt; id和products.user_id为$ review-&gt; user-&gt; ID在刀片模板中。

我正在尝试这种连接变体:

$reviews_query = Review::orderBy('reviews.id', 'DESC')
            ->Join('products', 'reviews.product_id', '=', 'products.id')
            ->Join('categories', 'products.category_id', '=', 'categories.id')
            ->Join('brands', 'products.brand_id', '=', 'brands.id')
            ->Join('users', 'reviews.user_id', '=', 'users.id')
            ->where('reviews.active', '=', 1)
            ->GroupBy('reviews.id')->paginate(5);

这用于按category_id过滤:

if (Input::has('category_id')){
    $category_id = Input::get('category_id');
    $reviews_query->where('categories.id', $category_id);
}

我不确定如何正确处理不明确的ID,例如我们在刀片模板中的product_id,review_id,user_id($ review-&gt; id,$ review-&gt; user-&gt; id,所有这些都是相互混淆的)

3 个答案:

答案 0 :(得分:2)

在类别模型中添加hasManyThrough关系

public function reviews() {
    return $this->hasManyThrough('App\Review', 'App\Product');
}

现在您可以按照此类别

进行所有评论
$category->reviews();

您可以添加其他查询子句,如

$category->reviews()->orderBy('id', 'DESC')->paginate(5);

答案 1 :(得分:0)

试试这个,

$reviews = DB::table('review')
->join('product', 'product.id', '=', 'review.product_id')
->Join('category', 'product.category_id', '=', 'category.id')
->orderBy('id', 'DESC')->paginate(5);

您可以访问更多内容 Laravel join with 3 Tables

这可能对你有用.....

答案 2 :(得分:0)

通过特定的CategoryID过滤所有评论,然后只需使用->

$categoryID = 1;
Categories::with(['products' => function($product){
        $product->with('reviews');
    }])->where('id', '=', $categoryID)->get();

还按特定的BrandID过滤所有评论,然后

$brandID = 1;
Brands::with(['products' => function($product){
        $product->with('reviews');
    }])->where('id', '=', $brandID)->get();