【问题标题】:Nested relationships for normalized db structure in FuelPHP ORMFuelPHP ORM中规范化数据库结构的嵌套关系
【发布时间】:2012-03-28 09:15:34
【问题描述】:

首先,很抱歉大量发布代码,但是...

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

+---------+    +--------------+    +--------+
|  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 来做到这一点将是王牌。

【问题讨论】:

    标签: orm nested relationship fuelphp


    【解决方案1】:

    这是一个多对多关系,请查看文档以了解如何配置。

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

    【讨论】:

    • 是Sentry认证包使用的结构,你的ORM一点也不喜欢。只需添加一个专门命名的 PK 即可解决所有问题。
    • ORM使用的所有表都必须有PK,不允许使用FK作为PK。所以如果这是 Sentry 定义的表格布局,那么他们做错了(如:以非 FuelPHP 兼容的方式)。
    【解决方案2】:

    嘎嘎!它只是在 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');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2018-08-14
      • 2013-09-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多