2016-05-22 2 views
1

У меня есть проблема, чтобы показать свои продукты, которые имеют определенную категорию И определенный пол, это мои таблицы миграции и модель: продуктов миграция:Laravel 5,1 - фильтр еще данные с отношением

Schema::create('products', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('name', 255); 
      $table->string('slug'); 
      $table->text('description'); 
      $table->string('extract', 300); 
      $table->decimal('price', 5, 2); 
      $table->string('image', 300); 
      $table->boolean('visible'); 
      $table->integer('user_id')->unsigned(); 

      $table->foreign('user_id') 
        ->references('id')->on('users') 
        ->onDelete('cascade'); 

      $table->integer('category_id')->unsigned(); 

      // relations 
      $table->foreign('category_id') 
        ->references('id') 
        ->on('categories') 
        ->onDelete('cascade'); 
      $table->integer('gender_id')->unsigned(); 


      $table->foreign('gender_id') 
       ->references('id') 
       ->on('genders') 
       ->onDelete('cascade'); 

      $table->timestamps(); 

модель продукт

<?php 

namespace dixard; 

use Illuminate\Database\Eloquent\Model; 

use dixard\User; 

use dixard\Category; 

use dixard\Gender; 

use dixard\OrderItem; 

use dixard\Color; 

class Product extends Model 
{ 

    protected $table = 'products'; 

    protected $fillable = 

    [ 
    'name', 
    'slug', 
    'description', 
    'extract', 
    'image', 
    'visible', 
    'price', 
    'category_id', 
    'gender_id', 
    'user_id' 

    ]; 



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


    } 

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

    } 

    public function gender() { 
     return $this->belongsTo('dixard\Gender'); 
    } 



    public function OrderItem() { 
      return $this->belongsTo('dixard\OrderItem'); 

    } 


    public function Color() { 
      return $this->belongsTo('dixard\Color'); 

    } 

} 

Категория миграции

Schema::create('categories', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('name', 255)->unique(); 

      $table->string('slug'); 
      $table->text('description'); 

      $table->string('color', 30); 


     }); 

Модель кошки egory

use dixard\Product; 

class Category extends Model 
{ 
    protected $table = 'categories'; 

    protected $fillable = [ 

    'name', 
    'slug', 
    'description', 
    'color', 


    ]; 
    public $timestamps = false; 

    public function products() { 

     return $this->hasMany('dixard\Product'); 

    } 

} 

Гендерные миграции

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateGendersTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('genders', function (Blueprint $table) { 
      $table->increments('id'); 

      $table->text('gender'); 


      //$table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('genders'); 
    } 
} 

Пол Модель

<?php 

namespace dixard; 

use Illuminate\Database\Eloquent\Model; 

use dixard\Product; 

class Gender extends Model 
{ 
    protected $table = 'genders'; 


    // gli dico che voglio scrivere questo campi 
    protected $fillable = [ 

    'gender', 


    ]; 
    public $timestamps = false; 

    public function products() { 

     return $this->hasMany('dixard\Product'); 

    } 
} 

Я пытаюсь показать все продукты, которые CATEGORY_ID = 1 (тенниска категория) и gender_id = 2 (Женщина пол), но у меня есть некоторые проблемы, это мой контроллер:

use dixard\Product; 
use dixard\Category; 
use dixard\Gender; 

class TshirtController extends Controller 
{ 

     public function men_tshirt() 
     { 
      $category = Category::where('name', '=', 't-shirt')->orderBy('id', 'desc')->first(); 
      $gender = Gender::where('gender', '=', 'woman')->orderBy('id', 'desc')->first(); 

      $products = $category->products(); 
      return view('store.shop.woman',compact('products')); 

      // It filter only category and not gender woman 

     } 
+0

мужчин мужская футболка для женщин? конечно? – aimme

ответ

1

Вы тянете модель «Пол» от БД, но не применяете ее к использованию. Попробуйте так:

 $products = $category->products()->where(['gender_id' => $gender->id])->get(); 
+0

большое спасибо! да, это работает так, как вы думаете, это лучший способ отфильтровать отношения из моих таблиц? спасибо за помощь! –

+0

Одна вещь, которую я узнал о Laravel, заключается в том, что существует десяток способов сделать все, и ни один из них не является «лучшим» или «правильным». Вы можете сделать все это как цепочку с одной строкой, или вы можете сделать кучу простых. Делайте все, что вам подходит. – deedoo

1

добавить это к модели продукта. Использование сфера Laravel в

product.php

public function scopeCategory($query, Category $category) 
{ 
    if($category) { 
     return $query->whereCategoryId($category->id); 
    } 
    return $query; 
} 

public function scopeGender($query, Gender $gender) 
{ 
    if($gender){ 
     return $query->whereGenderId($gender->id); 
    } 
    return $query; 
} 

в TshirtController

public function men_tshirt() 
{ 
    $category = Category::whereName('t-shirt')->orderBy('id', 'desc')->first(); 
    $gender = Gender::whereGender('woman')->orderBy('id', 'desc')->first(); 

    $products = Product::category($category)->gender($gender)->get()->toArray(); 

    return view('store.shop.men',compact('products')); 
} 

дополнительно вы можете добавить следующее product.php если вы хотите работать по обратным отношениям

public function categories() 
{ 
    return $this->belongsTo('dixard\Category.php'); 
} 

public function gender() 
{ 
    return $this->belongsTo('dixard\Gender.php'); 
} 
+0

Я получаю эту ошибку: ErrorException в строке TshirtController.php 33: Нестатический метод dixard \ Product :: category() не следует называть статическим, предполагая $ this из несовместимого контекста, i corrected -> $ products = Products with Продукт. –

+0

@ Diego182 Ooops..it должен быть Продуктом :: not Products :: typo – aimme