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

时间:2010-10-13 22:48:07

标签: php orm recursion relationship kohana-3

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

帖子模型有很多类别

帖子模型也有很多评论。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我终于这样做了,所以这里是我用过的代码,如果有人想要的话。

我没有声称自己是一名优秀的程序员,我很新。

如果有人真的打算使用它,并且需要我的逻辑帮助,我会完全评论它,但我今晚空着...

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