我有以下代码,其中我找到了一个标签。我想要包含与尚未“删除”的标记相关的所有帖子。然后我想找到这些帖子所属的所有标签。
作为测试,我在第三级递归,Tag和User,通过包含附加了两个模型。可包含的行为将检索与Post关联的User模型,但不会显示与帖子关联的Tag模型。想知道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行为代码,看看它是否与框架或可能的bug有关。
答案 0 :(得分:3)
这不是问题的真正答案(更多的是它发生的原因),但我认为这就是它发生的原因以及如何解决它。我挖到了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
)
)
)
)
)
);