Laravel:将字符串设置为模型的名称

时间:2016-09-22 17:04:47

标签: php laravel model

我在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)作为模型的名称?

3 个答案:

答案 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);