Вложенные отношения для нормализованной структуры БД в FuelPHP ORM - PullRequest
0 голосов
/ 28 марта 2012

Прежде всего, извините за мега-постинг кода, но ...

У меня есть следующая структура БД (не мой выбор):

+---------+    +--------------+    +--------+
|  users  |    | users_groups |    | groups |
+---------+    +--------------+    +--------+
|   id    |    |   user_id    |    |   id   |
|  name   |    |   group_id   |    |  name  |
+---------+    +--------------+    +--------+

Я создалотношения с ORM FuelPHP:

class Model_User extends Orm\Model
{
    protected static $_properties = array(
        'id',
        'name',
    );

    protected static $_has_many = array('usergroup');
}

class Model_Usergroup extends Orm\Model
{
    protected static $_table_name = 'users_groups';

    protected static $_properties = array(
        'user_id',
        'group_id',
    );

    protected static $_belongs_to = array('user', 'group');
}

class Model_Group extends Orm\Model
{
    protected static $_properties = array(
        'id',
        'name',
    );

    protected static $_has_many = array('usergroup');
}

И я сейчас пытаюсь получить запрос для отображения всех данных из 3 таблиц, используя следующее:

$data['users'] = Model_User::find()
    ->related('usergroup')
    ->related('usergroup.group')
    ->get();

Возвращается это

Array
(
    [1] => Model_User Object
        (
            [_is_new:Orm\Model:private] => 
            [_frozen:Orm\Model:private] => 
            [_data:Orm\Model:private] => Array
                (
                    [id] => 1
                    [name] => somename
                )

            [_original:Orm\Model:private] => Array
                (
                    [id] => 1
                    [name] => somename
                )

            [_data_relations:Orm\Model:private] => Array
                (
                    [usergroup] => Array
                        (
                        )

                )

            [_original_relations:Orm\Model:private] => Array
                (
                )

            [_view:Orm\Model:private] => 
            [_iterable:protected] => Array
                (
                )
        )
)

Итак, он начинает искать группы пользователей, но останавливается?Я даже правильно понимаю?Конечно, я мог бы получить это с помощью обычного запроса с объединениями, но было бы здорово знать, как это сделать с помощью ORM.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Gaaaak!В таблице users_groups просто отсутствовал PK ...

class Model_Usergroup extends Orm\Model
{
    protected static $_table_name = 'users_groups';
    protected static $_primary_key = array('pk_id');

    protected static $_properties = array(
        'pk_id',
        'user_id',
        'group_id',
    );

    protected static $_belongs_to = array('user', 'group');
}
1 голос
/ 28 марта 2012

Это отношение многие-многие, проверьте документы, чтобы увидеть, как это можно настроить.

Выбранное вами решение полезно только тогда, когда вам нужны дополнительные атрибуты, сохраненные с отношением в таблице users_groups.

...