2016-09-22 4 views
0

Laravel 5.2에서 다형성 작업을하고 있습니다. 모델 문자열의 이름을 설정하고 싶습니다. si 코드 :Laravel : 모델 이름으로 문자열을 설정하십시오.

"$ passport-> element_type"변수는 내 모델 이름을 보여줍니다. 나는 스위치 케이스로하고 싶지 않다. 다음과 같이 할 수 있습니까?

$ passport-> element_type :: find ($ passport-> element_id);

또는 모델 이름으로 변수 (element_type)를 어떻게 사용할 수 있습니까?

+0

어떤 PHP 버전을 사용하고 있습니까? –

+0

https://adamwathan.me/2015/09/03/pushing-polymorphism-to-the-database/ Adam Wathan은이 문제에 대한 해결책을 설명합니다. 나는 대답으로 만들 시간이 없으므로 여기에 링크를 놓을 것입니다. –

답변

0

시도해 보셨습니까?

$passport->element_type::find($passport->element_id); 

이 작동하지 않습니다

경우에, 나는 그

$type = new $passport->element_type; 
$type::find($passport->element_id); 

뜻을 알고있다.

+0

아니요 작동하지 않습니다. dd ($ type)가 "Window"를 반환합니다. 하지만 dd ($ type :: find ($ passport-> element_id)) 오류가 발생합니다. 'Window'클래스를 찾을 수 없습니다. – jakub

+0

'Class 'Window'not found '- 작동하려고하지만 모델을 찾지 못했습니다. – Samsquanch

+0

예, 그렇지만 dd (Window :: find ($ passport-> element_id))는 작동합니다 – jakub

1

당신은 적절한 모델 relations 설정해야합니다

class Passport extends Model 
{ 
    /** 
    * Get all of the owning likeable models. 
    */ 
    public function pasportable() 
    { 
     return $this->morphTo(); 
    } 
} 

class Window extends Model 
{ 
    public function pasport() 
    { 
     return $this->morphOne('App\Pasport', 'pasportable'); 
    } 
} 

class Floor extends Model 
{ 
    public function pasport() 
    { 
     return $this->morphOne('App\Floor', 'pasportable'); 
    } 
} 

class Wall extends Model 
{ 
    public function pasport() 
    { 
     return $this->morphOne('App\Wall', 'pasportable'); 
    } 
} 

를하고 옆에 의해 morph'ed 개체에 액세스 할 수 있습니다

$passport->element(); 
// or 

여권 :: ($ 아이디) 찾기 -> 요소를 ();

그것은 ELEMENT_TYPE 도움을

+0

감사합니다. 도움이되었습니다. – jakub

0

고마워에 따라 바닥, 벽 또는 윈도우의 모델을 반환해야합니다. 마지막으로 작동하지만 경로를 추가해야했습니다.

$type = App::make('\\App\\'.$passport->element_type);