2014-10-22 5 views
4

나는 laravel 튜토리얼에서 볼 :laravel - 왜 괄호가없는 함수 호출이 필요합니까?

이 항목이 기능이
Auth::user()->item; 

, 내부 모델 User.php : \

function item() { return $this->hasMany('Item', 'owner_id'); } 
이 항목은 모델입니다

Item.php

\ 그렇다면 item 함수가 호출 될 때 괄호가 필요하지 않은 이유는 무엇입니까? Like : Auth::user()->item(); 괄호를 넣으면 브라우저가 열리고 충돌합니다.

또한 Item.php의 이름을 Item2.php로 변경하고 Item 클래스의 이름을 Item2로 바꾸면 hasMany('Item2', 'owner_id')으로 바뀌면 작동하지 않습니다. 하지만 왜? '품목'은 어디에서 나온 것입니까?

감사합니다,

패트릭

+0

'Auth :: user() -> item'의 컨텍스트를 제공 할 수 있습니까? 내 예비 결론은 어딘가에 함수의 참조가 필요하다는 것입니다. – Victor

답변

5

Laravel은 임의의 속성을 처리하기 위해 마법의 기능 __get를 사용합니다.

Illuminate\Database\Eloquent\ModelgetAttribute 함수를 호출합니다.이 함수는 모델의 관계를 확인하고 해당 이름과 관계가있는 경우 관련 항목을 반환합니다.

items이 요청되면 getAttribute은 자동으로 items() 기능을 실행하기 때문에 괄호가 필요하지 않습니다. 그런데 작업 할 수있는 쿼리 작성기를 반환하는 Auth::user()->item();을 요청할 수 있습니다.

+0

하지만이게 왜 작동하는지 : Auth :: user() -> itemszo; 공개 함수 itemszo() { return $ this-> hasMany ('Item', 'owner_id'); } 내 항목에는 '항목점'이 없습니다. – trogne

+1

@trogne 속성'itemszo'를 요청하면 ** itemszo()가 실행됩니다 ** ** 존재합니다. 이 함수는 존재하는'Item' 모델과 관계를 만듭니다. – ceejayoz

+0

그렇다면 final()을 사용하지 않고 Auth :: user() -> getAuthPassword를 실행하면 getAuthPassword() 함수가 실행되지 않습니다. – trogne

1

item() 메서드는 Eloquent ORM에 대한 쿼리를 준비하는 방법에 대한 관계를 설정하고 있습니다. ->item을 호출하면 Dynamic Properties을 통해 Eloquent에게 Item을 원하고 Eloquent가이 메서드를 사용할 것이라고 말합니다. 메서드가 Query Builder과 호환되는 경우에만 메서드를 직접 호출 할 수 있습니다. 당신이주는 예제는 어느쪽으로 든 작동해야하지만, 내가 빠진 것이있을 수 있습니다.