我在Laravel 5.2中使用多态。我想设置模型字符串的名称。有si代码:
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”给了我模型的名称。我不想用switch-case做这件事。是否可以做类似的事情:
$ passport-> ELEMENT_TYPE ::找到($ passport-> element_id);
或如何使用变量(element_type)作为模型的名称?
答案 0 :(得分: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');
}
}
然后您可以通过以下方式访问变形对象:
$passport->element();
// or
护照::找到($ ID) - >元素();
它应该返回楼层,墙壁或窗口的模型,具体取决于element_type
答案 1 :(得分:0)
你试过吗?
如果
$passport->element_type::find($passport->element_id);
不起作用,我知道
$type = new $passport->element_type;
$type::find($passport->element_id);
意愿。
答案 2 :(得分:0)
谢谢大家的帮助。最后工作,但我需要添加路径:
$type = App::make('\\App\\'.$passport->element_type);