未检索到CakePHP可控制模型



我在下面的代码中找到了一个标记。我想包含所有与未被"删除"的标签相关的帖子。然后我想找到这些帖子所属的所有标签。

作为测试,我通过contain将两个模型附加到Post的第三级递归,Tag和User。可包含的行为将检索与帖子关联的用户模型,但与帖子关联回的标记模型不会出现。你知道CakePHP中是否允许这种类型的递归(基于原始模型)吗?

我已经尝试了包含和不包含Tag条件,所以我知道这不是问题的原因。如果这是问题所在,那么我应该得到一个空的Tag数组,但什么都没有。

$tag = $this->Tag->find(
    'first',
    array(
        'conditions' => $conditions,
        'contain' => array(
            'Post' => array(
                'conditions' => array(
                    'Post.deleted' => 0
                ),
                'limit' => 25,
                'User',
                'Tag' => array(
                    'conditions' => array(
                        'Tag.deleted' => 0
                    )
                )
            )
        )
    )
);

我知道有很多方法可以解决这个问题,但我特别感兴趣的是为什么可控制的行为会这样做。我相信,在这种情况下,获取帖子的所有标签比循环浏览帖子结果并重新查询标签更有效。我希望有人会有这个问题的经验,但我今天会深入研究CakePHP可控制的行为代码,看看它是针对框架的还是可能的错误。

这并不是这个问题的真正答案(更多的是为什么会发生这种情况),但我认为这就是为什么会发生以及如何绕过它。我深入研究了Containable类,并且在构建查询时保持了我的Tag模型不变,这让我相信model类中的查询和关联可能会删除它,因为Tag不明确。标记将同时出现在Post记录的左侧和右侧,因此它可能会被删除以防止递归循环。我太懒了,没有深入研究Model类来得到真正的答案。

为了解决这个问题,我绑定了一个模型别名来动态发布,名为PT。我把这个别名添加到了包含代码中,瞧,我的标签就在那里!

$this->Tag->Post->bindModel(
            array(
                'hasAndBelongsToMany' => array(
                    'PT' => array(
                        'className' => 'Tag'
                    )
                )
            )
        );

并且包含代码。。。

$tag = $this->Tag->find(
            'first',
            array(
                'conditions' => $conditions,
                'contain' => array(
                    'Post' => array(
                        'conditions' => array(
                            'Post.deleted' => 0
                        ),
                        'User',
                        'PT' => array(
                            'conditions' => array(
                                'PT.deleted' => 0
                            )
                        )
                    )
                )
            )
        );

最新更新