Используя PHP и Kohana 3, можно ли рекурсивно находить и выводить отношения любой модели? - PullRequest
0 голосов
/ 14 октября 2010

Допустим, у нас есть модель пользователя, которая имеет много сообщений.

Модель сообщений имеет много категорий

Модель сообщений также имеет много комментариев.

Как мы находим динамически, отношения, которые имеет пользовательская модель?

Идея состоит в том, чтобы создать административный сервер для сайта, где я мог бы иметь одну функцию, которая при передаче модели может извлекать все данные, относящиеся к этому объекту, и отображать их на основе отношения найденных данных.

Полагаю, мне нужен сам доступ к модели, а не к экземпляру.

Буду признателен за любую помощь, спасибо.

1 Ответ

0 голосов
/ 03 декабря 2010

Я наконец сделал это, так что вот код, который я использовал, если кто-то еще хочет.

Я не претендую на то, чтобы быть хорошим программистом, я довольно нов.

Если кто-тона самом деле собирался использовать это и нуждался в некоторой помощи с моей логикой, я закомментирую это полностью, но сегодня вечером я работаю на пустом месте ...

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
...