2016-09-22 49 views
0

我正在Laravel 5.2中使用多態。我想設置模型字符串的名稱。有si代碼:Laravel:將字符串設置爲模型的名稱

switch ($passport->element_type) { 
      case 'Window':  
       $windows = Window::find($passport->element_id); 
       break; 
      case 'Floor':  
       $floor = Floor::find($passport->element_id);      
       break; 
      case 'Wall': 
       $wall = Wall::find($passport->element_id); 
      default: 
       break; 
     } 
    }; 

你可以看到變量「$ 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)返回我的「窗口」。但是dd($ type :: find($ passport-> element_id))會拋出錯誤。未找到Class'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 

護照::發現($ ID) - >元素( );

,並應根據ELEMENT_TYPE

+0

謝謝。它有幫助。 – jakub

0

謝謝你們的幫助返回地面,牆壁或窗戶的模型。最後的作品,但我需要添加路徑:

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