2015-05-26 74 views
0

我有3點型號的對象,即:CategoriesCategory_products & Products多屬於關聯雄辯

分類:

<?php 
class Categories extends Model 
{ 
    protected $table = 'categories'; 
    public function product_ids() { 
     return $this->hasMany("app\Models\categories\Category_products", "category_id", "id"); 
    } 
?> 

Category_products:

<?php 
class Category_products extends Model 
{ 
    protected $table = 'category_products'; 
    public function product_ids(){ 
     return $this->belongsTo('app\Models\categories\Category'); 
    } 

    public function products(){ 
     return $this->hasOne("app\Models\Product", "id", "product_id"); 
    } 
} 
?> 

和產品:

<?php 
class Product extends Model { 
    protected $table = 'products'; 
    public function product(){ 
     return $this->belongsTo("app\Models\categories\Category_products"); 
    } 
?> 

現在在我的CategoryController我做的:

$this->data["products"] = Categories::find($id)->product_ids()->products()->get(); 

但現在我得到一個錯誤:

Call to undefined method Illuminate\Database\Query\Builder::products() 

我怎樣才能做到這一點的正確方法?

+0

你product_ids()返回一個屬於關聯關係「」應用程序\型號\ categories \ Category「,這可能是你錯誤的誘因。 – ChainList

+0

它怎麼會導致錯誤,以及如何解決它? – Chilion

回答

1

好吧,我要試試。

我想你在閱讀Laravel文檔時遺漏了一些東西。

您不必創建category_products模型,因爲它是您的類別和您的產品之間的數據透視表。

「通常」,你應該有這樣的事情:

產品:

. id 
. name 

分類:

. id 
. name 

category_product(按字母順序排列的名字)

. product_id 
. category_id 

和你的模型:

class Category extends \Eloquent { 

    public function products() 
    { 
     return $this->belongsToMany('namespace\to\your\model\Product'); 
    } 
} 

class Product extends \Eloquent { 

    public function categories() 
    { 
     return $this->belongsToMany('namespace\to\your\model\Category'); 
    } 
} 

然後你就可以做到以下幾點:

$this->data["products"] = Category::find($id)->products; 

$this->data["products"] = Category::find($id)->products()->get(); 

Laravel會照顧調用數據透視表爲您服務。

這不是常見的有複數來命名類,習慣用自己奇異

命名類,另請參閱:http://laravel.com/docs/5.0/eloquent#many-to-many

+0

所以,如果我弄清楚了,我不必告訴任何地方Laravel category_products是否存在,它會自動檢測到它? – Chilion

+0

如果遵循Laravel命名約定,no。但是您可以在belongsToMany方法的第二個參數中精確定義表名d。如果您沒有將任何表名稱傳遞給belongsToMany,Laravel會用您的類名稱(按字母順序排列)檢索您的數據透視表 – ChainList