2013-08-06 4 views
34

개체 컬렉션이 있습니다. 객체가 태그라고 가정 해 보겠습니다.Laravel 4 - 컬렉션에서 속성 배열 가져 오기

$tags = Tag::all(); 

각 태그에 대해 특정 속성, 즉 그 이름을 가져 오려고합니다. 물론 할 수 있습니다

foreach ($tags as $tag) { 
    $tag_names[] = $tag->name; 
} 

그러나이 문제에 대한 해결책은 더 있습니까?

같은 것 $tags->name?

+0

'$ tags-> name' 나 또한 처음에는 그렇게 기대했지만, 그렇지 않은 –

+0

작동합니다 :'정의되지 않은 속성 : \ 데이터베이스 \ 웅변 \ 컬렉션 : $ name' – severin

+0

조명을 @severin $ tags는 name 속성을 가진 단일 객체가 아닌 객체의 컬렉션입니다. 각 태그 이름을 얻기 위해 $ tags를 반복해야합니다. 태그에서 이름 속성을 가져 오는 것은 의미가 없습니다. 어떤 이름 속성을 실제로 인쇄 할 것으로 가정합니까? –

답변

68

컬렉션에는 @Gadoma가 설명하는 표의 방법과 비슷한 lists 방법이 있습니다.컬렉션의 각 항목에 대해 지정된 속성 값을 포함하는 배열을 반환합니다.

내가 간단하게 사용할 수있는 태그의 내 컬렉션에서 이름의 원하는 배열을 검색하려면 :

$tags->lists('name'); 

업데이트 : 5.2listspluck로 대체 laravel 를 사용합니다.

$tags->pluck('name'); 

는 구체적으로는, laravel 5.2 upgrade guide는 "[t]가 자신이 수집, 쿼리 빌더 및 웅변 쿼리 빌더 오브젝트에 lists 메소드 pluck으로 바뀌 었습니다. 메소드 서명은 동일하게 유지된다."고 언급

+0

'lists' 메소드는 매우 좋은 결과입니다. –

+1

html select form을 생성하는 경우 목록이 너무 좋아진다 : 'form :: select ('subcategory', array (null => '선택)') + $ category-> firstSubcategories-> lists ('name', 'id'))' – RY35

+1

@BishalPaudel 또는 컨트롤러에서'Form :: select ('subcategory' , array (null => 'Please Choose') + $ firsSubcategories)', 블레이드에서 모두 동일합니다. – briankip

3

array_column (PHP 5.5 함수이지만 Laravel은 대부분 동작을 복제하는 도우미 함수를 가지고 있습니다).

이와 같은 것으로 충분합니다.

$tag_names = array_column($tags->toArray(), 'name'); 
+0

감사합니다. 그거야. 그러나'lists' 메서드는 훨씬 더 익숙하지 않은 것으로 생각합니다. – severin

+0

물론, 나는 항상 '목록'을 잊어 버린다. –

25

네가 멋지고 쉽게 할 수있다. Laravel 4 Documentation states, 당신은 행에서 하나의 열을 가져 오는 테이블

$user = DB::table('users')->where('name', 'John')->first(); 

var_dump($user->name); 

에서 단일 행을 검색하는 표

$users = DB::table('users')->get(); 

foreach ($users as $user) 
{ 
var_dump($user->name); 
} 

에서 모든 행을 검색

할 수

열 목록을 가져 오는 중는

역할 제목의 배열을 반환합니다

$roles = DB::table('roles')->lists('title'); 

이 방법을 값. 또한 반환 된 배열에 대한 사용자 지정 키 열을 지정할 수 있습니다 :

$roles = DB::table('roles')->lists('title', 'name'); 

이 SELECT 절

지정
$users = DB::table('users')->select('name', 'email')->get(); 

$users = DB::table('users')->distinct()->get(); 

$users = DB::table('users')->select('name as user_name')->get(); 

이 편집 :

는 위의 예에 액세스하는 방법을 보여줍니다 Laravel의 유창한 쿼리 작성 도구를 사용하여 당신이 모델을 사용하는 경우 설득력이 internaly 쿼리 빌더를 사용하기 때문에 아무 문제없이 할 수있는, Laravel's Eloquent ORM

과 데이터에 액세스 할 수 있습니다 할 다음과 같은 사항 :

:도 함께 할 수

$tag_names = $tags->lists('tag_name_label', 'tag_name_column')->get(); 

$tag_names = DB::table('tags')->lists('tag_name_label', 'tag_name_column')->get(); 
+0

감사. 이것은 실제로 적절한 해결책으로 이끌었지만 수집에 적용되는 DB 방법과 방법 사이에 당신의 대답에 약간의 혼란이있는 것 같습니다. – severin

+0

귀하의 의견에 따라 편집 됨. 감사합니다, – Gadoma

+0

내가 생각하는 편집에서 태그 :: 목록 ('tag_name_label') -> get(); – Anji

7

오늘 아침 내 실험에서 발췌 한 내용입니다. 콜렉션에 $ collection-> distinct() 메소드가 있기를 바란다. 그래서 이미 필터링 된 콜렉션을 기반으로하는 컬럼 값 목록을 쉽게 생성 할 수있다.

생각하십니까?

이 스 니펫이 표, 컬렉션 및 우수 모델에서 고유 값 목록을 생성하기위한 몇 가지 대체 옵션을 명확히하는 데 도움이되기를 바랍니다.

웅변 모델을 사용하여 (해피)

/** 
* Method A 
*  Store Collection to reduce queries when building multiple lists 
*/ 
$people = Person::get(); 
$cities = array_unique($people->lists('city')); 
$states = array_unique($people->lists('state')); 
// etc... 

컬렉션을 사용하여 (행복한) 웅변 모델 PLUS 캐싱 (행복한)

/** 
* Method C 
*  Utilize the Eloquent model's methods PLUS the built in Caching 
*  Queries only run once expiry is reached 
*/ 
$expiry = 60; // One Hour 
$cities = Person::remember($expiry)->distinct()->lists('city'); 
$states = Person::remember($expiry)->distinct()->lists('state'); 
를 사용

/** 
* Method B 
*  Utilize the Eloquent model's methods 
*  One query per list 
*/ 
// This will return an array of unique cities present in the list 
$cities = Person::distinct()->lists('city'); 
$states = Person::distinct()->lists('state'); 

여러분이 가지고 있다면이 대안을 듣고 싶습니다!

@ErikOnTheWeb

관련 문제