2016-05-22 4 views
1

ich habe ein Problem meine Produkte zu zeigen, dass eine bestimmte Kategorie und bestimmtes Geschlecht hat, das ist meine Tabellen Migration und Modelle: Migration Produkte:Laravel 5.1 - mehr ein Datum mit Beziehung Filter

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(); 

Modell Produkt

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

    } 

} 

Kategorie Migrationen

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

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

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


     }); 

Modell categor y

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

    } 

} 

Geschlecht Migrationen

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

Geschlecht Modell

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

    } 
} 

Ich versuche, alle Produkte zu zeigen, dass category_id haben = 1 (T-Shirt-Kategorie) und gender_id = 2 (Frau Geschlecht), aber ich habe ein Problem, das ist mein Controller:

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

männer t-shirt für frauen? sicher? – aimme

Antwort

1

Sie ziehen das Gender-Modell aus der DB, verwenden es aber nicht. wie diese versuchen:

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

vielen Dank! ja es funktioniert so, meinst du, das ist der beste Weg, um die Relationen aus meinen Tabellen zu filtern? Danke für Ihre Hilfe! –

+0

Eine Sache, die ich über Laravel gelernt habe, ist, dass es ein Dutzend Möglichkeiten gibt, alles zu tun und keiner von ihnen ist "der beste" oder "der richtige" Weg. Sie können die ganze Sache als eine verkettete Ein-Zeilen-Abfrage oder Sie können eine Reihe von einfachen tun. Tu, was immer sich für dich anfühlt. – deedoo

1

dieses Modell Artikel hinzufügen. Verwenden Laravel des Umfang

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

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

zusätzlich Sie vielleicht folgenden product.php hinzufügen, wenn Sie wollen auf umgekehrte beziehungen arbeiten

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

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

Ich bekomme diesen Fehler: ErrorException in TshirtController.php Zeile 33: Nicht-statische Methode Dixard \ Product :: Kategorie() sollte nicht statisch aufgerufen werden, unter der Annahme, $ aus inkompatiblen Kontext, ich korrigiert -> $ products = Produkte mit Produkt. –

+0

@ Diego182 Ooops..es sollte Produkt sein :: nicht Produkte :: Tippfehler – aimme