Cake PHP 在两张桌子上加入相同的模型

Posted

技术标签:

【中文标题】Cake PHP 在两张桌子上加入相同的模型【英文标题】:Cake PHP joining same model on two tables 【发布时间】:2012-05-18 09:47:21 【问题描述】:

我有一个关于模型关联的问题。考虑以下应用:每个月都会向用户提出一个新问题。这些有能力给出关于这个问题的提示,其他用户有能力对这个提示做出反应。我的模型设置是这样的:

Users hasMany Tips, Reactions

Tips belongsTo User

Tips hasMany Reactions

Reactions belongsTo User, Tip

现在我想从所有用户那里获得有关该问题的所有提示。我在tips-table 上做了一个简单的find all,它返回了所有与他们的用户和反应相关的tips。然而,反应不包含用户,这显然非常重要。

Cake 自动将我的 find all 转换为两个查询:一个在提示表上加入用户,一个在反应表上,但用户表上没有加入,这是我需要的。

所以我的问题是:为什么用户表没有加入反应,我该如何解决这个问题?

代码:

用户模型:

public $hasMany = array('Tip', 'Reaction');

提示模型:

public $hasMany = array('Reaction' => array(
        'foreignKey' => 'tip_id'
    ));

public $hasOne = array('User' => array(
        'fields' => array(
            'User.id, User.first_name, User.last_name'
        ),
        'foreignKey' => 'id'
    ));

反应模型:

public $belongsTo = array('Tip', 'ReactionUser' => array(
        'className' => 'User',
        'foreignKey' => 'id'
    ));

控制器:

$tips = $this->Tip->find('all');

输出:

array(
    (int) 0 => array(
        'Tip' => array(
            'id' => '1',
            'user_id' => '1',
            'question_id' => '1',
            'tip' => 'Testing da new datavbase',
            'votes' => '0',
            'approved' => '1',
            'pic' => '',
            'created' => '2012-05-18 09:22:56'
        ),
        'User' => array(
            'id' => '1',
            'first_name' => 'Bart',
            'last_name' => 'De Bock'
        ),
        'Reaction' => array(
            (int) 0 => array(
                'id' => '1',
                'tip_id' => '1',
                'user_id' => '1',
                'reaction' => 'lorem ipsum',
                'votes' => '0',
                'approved' => '1',
                'pic' => '',
                'created' => '0000-00-00 00:00:00'
            )
        )
    ),
    (int) 1 => array(
        'Tip' => array(
            'id' => '2',
            'user_id' => '2',
            'question_id' => '1',
            'tip' => 'Test',
            'votes' => '0',
            'approved' => '1',
            'pic' => '',
            'created' => '2012-05-18 10:22:51'
        ),
        'User' => array(
            'id' => '2',
            'first_name' => 'Deborah',
            'last_name' => 'Rochtus'
        ),
        'Reaction' => array(
            (int) 0 => array(
                'id' => '2',
                'tip_id' => '2',
                'user_id' => '3',
                'reaction' => 'Say whaat?',
                'votes' => '2',
                'approved' => '1',
                'pic' => '',
                'created' => '2012-05-18 10:33:32'
            ),
            (int) 1 => array(
                'id' => '3',
                'tip_id' => '2',
                'user_id' => '4',
                'reaction' => 'Hmmm..',
                'votes' => '0',
                'approved' => '1',
                'pic' => '',
                'created' => '2012-05-18 10:33:44'
            )
        )
    )
)

如您所见,这些反应不包含关联用户...

感谢您的帮助!

【问题讨论】:

给我看看你的代码,你试过什么?? 请给我看你完整的控制器代码……你的模态看起来不错…… print_r($tips);它显示了什么...... 在模态中基本上我们必须这样定义: var $belongsTo = array( 'UserProduct' => array( 'className' => 'UserProduct', 'foreignKey' => 'user_product_id', '条件' => '', '字段' => '', '顺序' => '' )); 【参考方案1】:

使用可包含性:

在 AppModel 中:

public $uses = array('Containable');

将您的查找调用更改为:

$this->Tip->find('all', array('contain' => array('User', 'Reaction' => array('User'))));

【讨论】:

【参考方案2】:

请试试这个

$tips = $this->Tip->find('all' array( 'recursive'=>'2' ) );

根据需要,递归值可能是 1、2、3、4 等。

【讨论】:

以上是关于Cake PHP 在两张桌子上加入相同的模型的主要内容,如果未能解决你的问题,请参考以下文章

Cake PHP - 如何仅检查最后一个条件

如何在 Cake PHP 3.5 中设置模型之间的关联?

结合来自不同 CNN 模型的概率

Cake PHP 连接查询以关联数组形式返回

在两张纸上找到匹配的行

使用相同的模型实体框架С#访问不同的表[关闭]