使用 PHP 和 Kohana 3,可以递归地查找和输出任何模型的关系吗?

Posted

技术标签:

【中文标题】使用 PHP 和 Kohana 3,可以递归地查找和输出任何模型的关系吗?【英文标题】:Using PHP and Kohana 3, can one recursively find and output any model's relationships? 【发布时间】:2010-10-13 22:48:07 【问题描述】:

假设我们有一个包含许多帖子的用户模型。

帖子模型有很多类别

帖子模型也有很多评论。

我们如何动态找到用户模型之间的关系?

这个想法是为一个站点创建一个管理后端,在那里我可以拥有一个功能,当传递一个模型时,可以检索与该对象相关的所有数据,并根据找到的数据的关系显示它。

我猜我需要访问模型本身,而不是实例。

任何帮助将不胜感激,谢谢。

【问题讨论】:

您想要关系信息(元)还是所有相关记录? 好吧,如果我能找到那个信息,是的。 我想找到模型的所有关系,以及它所具有的关系类型。 为什么不在您的模型中创建自定义方法以返回您需要的格式的 $_has_one、$_has_many、$_belongs_to? 【参考方案1】:

我终于做到了,所以这是我使用的代码,如果其他人想要的话。

我并没有声称自己是一名优秀的程序员,我还是个新手。

如果有人真的要使用它,并且需要一些关于我的逻辑的帮助,我会完整地注释掉它,但我今晚会空手而归......

public function get_child_objects($recursive = 0, $init = FALSE)

    if ( ! $init )
    
        Session::instance()->delete('model_register');
        $init = TRUE;
        $model_register = array();
    
    else
    
        $model_register = Session::instance()->get('model_register');
    

    $return_array = array();

    $parent_id = $this->id;
    $parent_type = $this->_object_name;

    // prevent unending loops of many to many relationships
    if ( ! isset($model_register[$this->_object_name]) )
    
        $model_register[$this->_object_name] = TRUE;
    
    else
    
        return;
    

    Session::instance()->set('model_register', $model_register);

    if ( ! count($this->_has_many))
    
        return;
    

    // foreach _has_many relationship get objects
    foreach ($this->_has_many as $child_object_type => $child_object_data) 
        $child_object_type_singular = Inflector::singular( (string) $child_object_type);
        $child_object_type_plural = Inflector::plural( (string) $child_object_type);

        $many_to_many = FALSE;
        if (isset($child_object_data['through']))
        
            $many_to_many = TRUE;
        

        if (isset($child_object_data['model']))
        
            $child_object_type = $child_object_data['model'];
        

        if ( ! $many_to_many)
        
            $child_objects = ORM::factory($child_object_type_singular)
                        ->where($parent_type.'_id', '=', $parent_id)
                        ->find_all();

            if ( ! count($child_objects))
            
                continue;
            
        
        else
        
            $child_object_type_plural = Inflector::plural( (string) $child_object_type);
            $child_objects = $this->$child_object_type_plural->find_all();

            if ( ! count($child_objects))
            
                continue;
            
        

        $obj_arr = array();
        foreach ($child_objects as $child_object) 
        
            if ( (bool) $recursive)
            
                $recursive = $recursive - 1;
                $obj_arr[$child_object->id] = $child_object->get_child_objects($recursive, $init);
            
            else
            
                $obj_arr[$child_object->id] = NULL;
                           
        
        $return_array[$child_object_type_plural] = $obj_arr;


     // foreach

    return $return_array;
 // get_child_objects

【讨论】:

以上是关于使用 PHP 和 Kohana 3,可以递归地查找和输出任何模型的关系吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP Kohana 3 bootstrap.php for admin子文件夹

以递归方式查找最后在PHP中修改的文件和文件夹

是否可以在不使用整个框架的情况下在 PHP 中为 ORM 安装 Kohana 库?

php 后台转发和重定向的区别及kohana框架当前url加参数方式

已达到 PHP 最大数据库连接数 - 使用 Kohana/ORM 启动连接

PHP使用递归按层级查找数据