2016-09-22 6 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)は "Window"を返します。しかしdd($ type :: find($ passport-> element_id))はエラーをスローします。Class 'Window'が見つかりません。 – jakub

+0

'クラス 'ウィンドウ'が見つかりませんでした.' - 動作しようとしていますが、あなたのモデルが見つかりません。 – Samsquanch

+0

はい、しかしdd(Window :: find($ passport-> element_id))は – jakub

1

あなたが適切なモデルrelations設定する必要があります:あなたがしてオブジェクトをmorph'edするためにアクセスできる

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'); 
    } 
} 

と次の:

$passport->element(); 
// or 

パスポート::($ ID)を見つける - (>要素を);

、それはELEMENT_TYPE助けを

+0

ありがとう。それは助けになった。 – jakub

0

みんなありがとうによっては床、壁や窓のモデルを返す必要があります。最後に動作しますが、パスを追加する必要がありました:

$type = App::make('\\App\\'.$passport->element_type); 
関連する問題