2014-09-30 30 views
0

我對使用Laravel非常新,因此對於雄辯。我對Eloquent的餐桌關係感到困惑。在Laravel雄辯中獲取多個記錄加入

現在我明白瞭如何實現簡單連接,像Laravel 4.2的文檔中的例子對於一個一對多的關係,其中comment屬於一個post,但post可以有很多comments。他們用這個語法從一個職位獲得的評論:

Post::find(1)->comments; 

其中,在MySQL,大概是這樣的:

SELECT * FROM comments 
JOIN posts ON posts.id=comments.post_id 
WHERE posts.id=1 

,如果我想要得到的結果是什麼東西像這樣的得到的不僅僅是一行:

SELECT * FROM comments 
JOIN posts ON posts.id=comments.post_id 

我知道根據上面給出的例子沒有太大意義。但我如何在雄辯中做到這一點?

爲了給出更多的細節,我實際上試圖做的是顯示我的兩張表assetsasset_classifications的連接結果。 asset屬於一個asset_classification,並且asset_classification有許多assets

我試圖顯示assets的表格數據,其中包括他們的asset_classifications。在MySQL中,它是這樣的:

SELECT * FROM assets 
JOIN asset_classifications ON asset_classifications.id=assets.classification_id 

我該如何在Eloquent中執行它?

+0

不,這不是你在MySQL中所想的 - 有2個獨立的查詢運行。而且您需要http://laravel.com/docs/eloquent#eager-loading或者如果您願意,那麼只需使用'join()'方法 – 2014-09-30 09:25:48

+0

@JarekTkaczyk謝謝!我會給它一個閱讀。 – christianleroy 2014-09-30 09:31:31

+0

閱讀文檔,接下來您可以查看http://softonsofa.com/querying-relations-in-laravel-4-nested-relation/和其他文章。 – 2014-09-30 10:32:49

回答

4

我猜你對SQL有點太貼切了:)嘗試在連接之外思考,並在模型和melattionships中查詢更多,因爲Laravel處理所有抽象。

所以,你有一個資產模型:

class Asset extends Eloquent 
{ 
    public function classification() 
    { 
     return $this->belongsTo('AssetClassification'); 
    } 
} 

...和AssetClassification mdoel:

class AssetClassification extends Eloquent 
{ 
    public function assets() 
    { 
     return $this->hasMany('Asset'); 
    } 
} 

而現在,他們有聯繫,你可以做任何你想要的。如果你想輸出的所有資產及其分類,沒有問題:

$assets = Asset::all(); 

foreach($assets as $asset) 
{ 
    echo "{$asset->name}" is classified as {$asset->classification}"; 
} 

或者周圍的其他方式:

$classifications = AssetClassification::all(); 

foreach($classifications as $classification) 
{ 
    echo "{$classification->name} has the following assets:"; 

    foreach($classification->assets as $asset) 
    { ... } 
} 

爲數組,這會看起來像

[0] => [ 
     'id' => 1 
     'name' => 'asset_name_1', 
     ], 
[1] => [ 
     'id' => 2 
     'name' => 'asset_name_2', 
     ], 

你明白了。問題是,你在每次迭代時都會做一個單獨的查詢。這就是爲什麼你應該使用eager loading不還加載所有資產,而且他們的依賴:

$assets = Asset::with('classification')->get(); 

現在你將有一個這樣的數組:

[0] => [ 
     'id' => 1 
     'name' => 'asset_name_1', 
     'classification' => AssetClassiciation-Object 
     ], 
[1] => [ 
     'id' => 2 
     'name' => 'asset_name_2', 
     'classification' => AssetClassiciation-Object 
     ], 

所以現在你可以通過資產及其分類循環而不需要進一步的SQL查詢。

+0

感謝您的支持。我只是開始更深入地研究Laravel和雄辯,而你的回答是一個很好的幫助。 :) – christianleroy 2014-09-30 09:37:47