我如何在 Laravel 中获取关系类型

Gör*_* D. 2 php laravel eloquent

我有一个这样的问题,我想在具有 70 个模型的自定义项目中编写自己的表单生成器,但我需要学习雄辩的关系类型以及 2 或 3 个深度。

例如:

class Category extends BaseModel
{
    public function details()
    {
        return $this->hasMany(CategoryDetail::class);
    }
}


class CategoryDetail extends BaseModel
{
    public function extras()
    {
        return $this->morphMany(Extra::class,'model');
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西:

learnMethodType(Category::class,'details');
Run Code Online (Sandbox Code Playgroud)

真正的需求:数据来自构建的json

 learnMethodType(Category::class,'details.extras'); 
Run Code Online (Sandbox Code Playgroud)

返回应该是这样的:

['model'=> CategoryDetail::class,'type'=>'hasMany', ... other parameters];

['model'=> Extra::class,'type'=>'morphMany', 'name'=> 'model'];
Run Code Online (Sandbox Code Playgroud)

小智 6

这个实现怎么样?

function learnMethodType($classname,$method){
    $oReflectionClass = new ReflectionClass($classname);
    $method = $oReflectionClass->getMethod($method)
    $type = get_class($method->invoke($classname))
    return $type;
}
Run Code Online (Sandbox Code Playgroud)

或者简单地这样:

function learnMethodType($classname,$method){
    $obj = new $classname;
    $type = get_class($obj->{$method}())
    return $type;
}
Run Code Online (Sandbox Code Playgroud)

对于您的情况,您还可以添加

function get_short_class($obj){
    return (new \ReflectionClass($obj))->getShortName();
}
Run Code Online (Sandbox Code Playgroud)

并将上面的 get_class 替换为 get_short_class 。

如果您担心反射类,可以使用一些基准: