2015-07-06 2 views
2

Опишу эту ситуацию с более подробной информацией:Laravel Eloquent: как фильтровать отзывы продуктов по категориям продуктов и/или бренду?

У меня есть список продуктов, в которых каждый товар относится к определенной категории и к определенной марке. Некоторые из продуктов могут быть просмотрены пользователями.

В обзоре/странице в моем приложении Laravel, у меня есть список обзоров и выберите поля для категории и бренда вместе с кнопкой поиска, конечно.

Если вы не выбрали категорию или бренд, все обзоры будут отображаться, разбиваться на страницы, и это хорошо.

Проблема возникает, когда пользователь выбирает категорию или бренд или и то, и другое, и пытается получить все отзывы, отфильтрованные таким образом.

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

Если я использую соединения, то $ Обзор-> user-> идентификатор, $ Обзор-> user-> имя пользователя, $ Обзор-> идентификатор являются Неправильно, я получаю review.product_id как $ review-> id и products.user_id как $ review-> user-> 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); 
} 

Я не знаю, как правильно решить неоднозначные идентификаторы таких нас product_id, review_id, user_id в шаблоне клинка ($ review-> id, $ review-> user-> id, все перепутаны друг с другом)

+0

где вы храните отзыв ...? –

+0

Как вы это понимаете?В таблице базы данных отзывов – mpet

+0

так просто проверьте, что где хранится конкретный товарный обзор или нет .. ?? вы можете получить только тот продукт –

ответ

0

Попробуйте это,

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

больше вы можете visit- Laravel join with 3 Tables

Это может работать для Вас .....

+0

Это быть хорошим, но делает меня ошибкой в ​​шаблоне клипа, где я ошибаюсь. $ review-> id – mpet

+1

вы получите хорошую ссылку в указанной ссылке ... –

2

Добавить hasManyThrough отношения в вашей категории модели

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

теперь вы можете есть все отзывы по данной категории

$category->reviews(); 

вы можете добавить другие пункты запроса к нему как

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

Это решает проблему с неправильным $ review-> id в шаблоне клинка и что Хорошо. Я блуждаю, как подфильтровать обзоры на основе Input :: get ('category_id)? Есть ли у вас какие-либо идеи? – mpet

Смежные вопросы