FuelPHP ORM中规范化数据库结构的嵌套关系

时间:2012-03-28 09:15:35

标签: orm nested relationship fuelphp

首先,对于大量发布代码感到抱歉,但是......

我有以下数据库结构(不是我的选择):

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

我与FuelPHP的ORM建立了关系:

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
                (
                )
        )
)

所以它开始找到users_groups但停止?我是否以正确的方式接受了这个?当然,我可以使用连接的常规查询来获得这个,但实际上知道如何使用ORM进行此操作将是一件事。

2 个答案:

答案 0 :(得分:1)

这是一个多关系,检查文档以了解如何配置它。

您选择的解决方案仅在您需要使用users_groups表中的关系保存的其他属性时才有用。

答案 1 :(得分:1)

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');
}