2014-02-06 101 views
4

例如,我有一個產品,我有一個BaseProduct。如何從Laravel的hasMany()關係中獲取所有結果?

在模型的產品,我指定了以下內容:

//In class Product 
public function BaseProduct() 
{ 
    return $this->belongsTo("BaseProduct", "BaseProductId"); 
} 

在BaseProduct,我已經指定了以下關係:

//In class BaseProduct 
public function Products() 
{ 
    return $this->hasMany("Product", "ProductId"); 
} 

如果我選擇產品,如下所示:

$Product::first() 

我可以通過執行以下操作獲取BaseProduct:

$Product::first()->BaseProduct()->get(); 

非但沒有從結果的數組,我怎麼會得到BaseProduct的Model,這樣我就可以得到所有BaseProduct的孩子,這意味着必須與這個外鍵的所有產品BaseProduct。我試過BaseProduct()->all();,但它不是一個有效的方法。


編輯:

我創建的功能如下調用鏈 - 但是這太可怕了。

return BaseProduct::find(Product::first()->BaseProduct()->getResults()['BaseProductId'])->Products()->getResults(); 

最後編輯:

我在BaseProduct模型犯了一個錯誤。在Products()函數中,我指定了return $this->hasMany("Product", "ProductId");,其中ProductId應該是BaseProductId

我固定的之後,我可以成功地使用:

Product::first()->BaseProduct->products; 

正如謝赫Heera曾解釋。

+0

類似於:$ product-> BaseProduct() - > first() - > products? – JustinHo

+0

根據[文檔](http://laravel.com/api/class-Illuminate.Database.Eloquent.Relations),由於'BaseProduct()'返回一個'BelongsTo'對象,導致'BadMethodCallException'不幸。 BelongsTo.html) –

回答

9

爲了得到BaseProduct的孩子,你可以試試這個:

$bp = BaseProduct::with('Products')->get(); 

現在,你有BaseProduct集合的話,你可以使用這樣的事情:

$bp->first()->products 

或取得第二個項目從收集

$bp->get(1)->products 

此外,您可能運行環這樣的(最有可能在視圖中後傳遞):

// From the controller 
$bp = BaseProduct::with('Products')->get(); 
return View::make('view_name')->with('baseProduct', $bp); 

View

@foreach($baseProduct->products as $product) 
    {{ $product->field_name }} 
@endforeach 

更新:是的,你可以試試這個

$product = Product::first(); 
$baseProduct = $product->BaseProduct; 

// Dump all children/products of this BaseProduct 
dd($baseProduct->products->toArray()); 

您可能鏈如:

Product::first()->BaseProduct->products; 

更新:你的表結構應該是這個樣子:

表:baseproduct

id(pk) | some_field | another_field 

表:產品

id(pk) | baseproduct_id(fk) | another_field 

根據這個表結構,關係應該是

// BaseProduct 
public function Products() 
{ 
    return $this->hasMany("Product"); 
} 

// Product 
public function Products() 
{ 
    // second parameter/baseproduct_id is optional unless 
    // you have used something else than baseproduct_id 
    return $this->belongsTo("BaseProduct", "baseproduct_id"); 
} 
+0

嗯 - 這是非常接近,謝謝你的回答。基本上,我想要做的是首先獲取產品,然後從該產品獲取BaseProduct,然後從該BaseProduct獲取具有該BaseProduct作爲其BaseProduct的所有產品。 是否有可能從首次使用產品開始使用您的方法,而不是首先獲取BaseProduct? –

+0

@Zaemz,檢查更新的答案。 –

+0

不幸的是,這會導致'BadMethodCallException'。 我確實執行了我想要的任務,並且更新了我的問題,但這是鏈接函數調用的非常難看的混亂。 –