我在下面的代码中找到了一个标记。我想包含所有与未被"删除"的标签相关的帖子。然后我想找到这些帖子所属的所有标签。
作为测试,我通过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
)
)
)
)
)
);