2014-09-30 4 views
0

저는 Laravel을 사용하는 데있어 매우 새롭습니다. 엘로 퀀트의 테이블 관계에 대해 혼란스러워하고 있습니다. Laravel Eloquent에서 조인을 사용하여 다중 레코드 가져 오기

은 지금은 단순 조인 한 - 투 - 많은 commentpost에 속하는 관계,하지만 post에 대한 comments 많은 수 Laravel 4.2의 문서의 예처럼 구현하는 방법을 이해합니다. MySQL의에서, 아마도,

Post::find(1)->comments; 

좋아 : 그들은 하나 개의 게시물에서 코멘트를 얻기 위해이 구문을 사용

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)의 조인 된 결과를 표시하는 것입니다. assetasset_classification에 속하며 asset_classification은 많은 assets입니다.

나는 asset_classifications을 포함하는 assets의 표 형식의 데이터를 표시하려고합니다. 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()'메서드를 사용하십시오. –

+0

@JarekTkaczyk 감사합니다! 나는 그것을 읽을 것이다. – christianleroy

+0

문서를 읽은 다음이 문서를 http://softonsofa.com/querying-relations-in-laravel-4-nested-relation/ 및 기타 기사에서 확인할 수 있습니다. –

답변

4

나는 SQL에 너무 조금 붙어있는 것 같아요. Laravel이 당신을 위해 모든 추상화를 처리하기 때문에, 조인과 생각 밖에서 모델과 melattionships를 생각해보십시오.

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', 
     ], 

과 같을 것 당신은 아이디어를 얻습니다. 문제는 각 반복마다 별도의 쿼리를 수행한다는 것입니다.

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

이 같은 배열 할 것이다 : 당신은 모든 자산뿐만 아니라 자신의 종속성을로드하지 eager loading를 사용해야하는 이유입니다 그래서 지금

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

을 할 수 있습니다 자산과 분류를 통해 루프 더 이상의 SQL 쿼리를 만들지 않아도됩니다.

+0

감사합니다. 저는 Laravel과 Eloquent로 더 깊이 파고 들기 시작했습니다. 답은 큰 도움이됩니다. :) – christianleroy

관련 문제