2015-01-13 3 views
3

학교 프로젝트의 경우 Laravel 프레임 워크에서 웹 사이트를 만들고 있습니다. 컨트롤러의 다 대다 테이블의 데이터로 작업 할 수 없습니다.Laravel은 많은 관계에서 데이터를 얻습니다.

여기 내 모델입니다 :

class Item extends Eloquent { 
    public function Tags() 
    { 
     return $this->belongsToMany('Tag', 'items_has_tags', 'items_id', 'tags_id'); 
    } 
} 

class Tag extends Eloquent { 
    public function LearningMaterials() 
    { 
     return $this->belongsToMany('LearningMaterial', 'learning_materials_has_tags', 'tags_id', 'learning_materials_id'); 
    } 
} 

내 컨트롤러 내 항목에서 모든 태그를 반복 할 :

//get all items 
$all = Item::where('public', '1')->get(); 

foreach($allLm as $item){ 
    $tags = $item->Tags(); 

    var_dump('will iterate'); 

    foreach($tags as $t){ 
     var_dump('will not iterate'); 
    } 
} 

내 코드에 어떤 문제가 있습니까? 내 항목에서 태그를 처리하려면 어떻게해야합니까?

참고 : 검색 엔진을 만들고 있습니다. 사용자가 "mana"와 같은 입력 값을 삽입하면 태그 "management"가있는 모든 항목이 표시되어야합니다.

답변

8

라라 벨의 belongsToMany 방법 관련 모델을 쿼리하고 가져 오지 않습니다. 이는 쿼리에 몇 가지 추가 제약이 있기를 원하기 때문입니다. 당신이해야 할 것은 : 단순히

$tags = $item->Tags()->get(); 

또는 :

$tags = $item->Tags; 
4

(이 경우 BelongsToMany의 인스턴스)를 관계 객체를 반환합니다 관계 함수를 호출. 이를 사용하여 실행하기 전에 추가 구성 요소를 쿼리에 추가하여 실행할 수 있습니다. 당신이 당신의 관계의 결과를 원하는 경우

$only4Tags = $item->Tags()->take(4)->get(); 

, 그냥 마법 속성을 사용 get() 또는 간단한 전화 : 예를 들어
특정 태그의 ID에 대해 당신이 그것을 할 것입니다 방법

$tags = $item->Tags()->get(); 
$tags = $item->Tags; 
+0

을 (그 배열에서 온)? – Pathros

+0

@Pathros 그렇다면 관계가 필요합니까? 당신은 id를 가지고 있다면'Tag :: find ([1, 2, 3])'와 같은 질의 만 할 수 있습니다. – lukasgeiter

+0

감사합니다. 그것은 여기서 [-] whereHas()와 그 다음에 -> whereIn()을 사용할 수 있다는 것을 알게 해주었습니다. [here] (https://stackoverflow.com/q/36593847/1883256). – Pathros