从Eloquent模型中获取所有关系

 陈跃西vs_298 发布于 2023-02-13 13:19

拥有一个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中 - 这是因为我们有更新的版本

2 个回答
  • 要做到这一点,你会知道模型中方法的名称 - 它们可以变化很大;)

    思考:

    如果你在方法中有一个模式,比如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中 - 这是因为我们有更新的版本

    2023-02-13 13:22 回答
  • 像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 ^^的新反射服务

    2023-02-13 13:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有