拥有一个Eloquent模型,是否有可能在运行时获得所有关系及其类型?
我试过看一下ReflectionClass
,但是我找不到任何对这种情况有用的东西.
例如,如果我们有经典Post
模型,有没有办法提取这样的关系?
- belongsTo: User - belongsToMany: Tag
Rob Gordijn.. 5
要做到这一点,你会知道模型中方法的名称 - 它们可以变化很大;)
思考:
如果你在方法中有一个模式,比如relUser/relTag,你可以过滤它们
或者遍历所有公共方法,看看是否Relation
弹出一个对象(坏主意)
你可以定义一个protected $relationMethods
(注意:Laravel已经使用$relations
),它包含一个带方法的数组.
在调用Post-> User()后,您将收到该系列中的一个BelongsTo
或另外一个对象 Relation
,因此您可以列出关系类型.
[编辑:评论后]
如果模型配备了受保护的模型,$with = array(...);
那么您可以在加载$Model->getRelations()
记录后查看加载的关系.没有加载记录时这是不可能的,因为尚未触及关系.
getRelations()
在... /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
但目前它没有出现在laravel.com/api的api中 - 这是因为我们有更新的版本
要做到这一点,你会知道模型中方法的名称 - 它们可以变化很大;)
思考:
如果你在方法中有一个模式,比如relUser/relTag,你可以过滤它们
或者遍历所有公共方法,看看是否Relation
弹出一个对象(坏主意)
你可以定义一个protected $relationMethods
(注意:Laravel已经使用$relations
),它包含一个带方法的数组.
在调用Post-> User()后,您将收到该系列中的一个BelongsTo
或另外一个对象 Relation
,因此您可以列出关系类型.
[编辑:评论后]
如果模型配备了受保护的模型,$with = array(...);
那么您可以在加载$Model->getRelations()
记录后查看加载的关系.没有加载记录时这是不可能的,因为尚未触及关系.
getRelations()
在... /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
但目前它没有出现在laravel.com/api的api中 - 这是因为我们有更新的版本
像Rob说的那样.循环遍历每个公共方法并检查是否返回关系是一个坏主意.
Barryvdh 在他非常受欢迎的Laravel-ide-helper中使用了一种基于Regex的方法:https: //github.com/barryvdh/laravel-ide-helper/blob/master/src/Console/ModelsCommand.php
您只需要在调用getPropertiesFromMethods之后过滤您收到的属性(未经测试的示例):
class classSniffer{ private $properties = []; //... public function getPropertiesFromMethods($model){ //the copied code from the class above (ModelsCommand@getPropertiesFromMethods) } public function getRelationsFrom($model){ $this->getPropertiesFromMethods($model); $relations = []; foreach($this->properties as $name => $property){ $type = $property; $isRelation = strstr($property[$type], 'Illuminate\Database\Eloquent\Relations'); if($isRelation){ $relations[$name] = $property; } } return $relations; } }
如果没有触及模型,是否有更简洁的方法?
我想我们必须等待PHP7(返回类型反射)或来自Taylor ^^的新反射服务