我有一个包含3 $ belongsTo引用键的活动表。我需要来自这些id的加入信息,即显示评论文本 - 我不想将文本存储两次......(对于帖子和主题都相同)。
活动表:id | post_id | comment_id | topic_id
在每一行中只设置了post_id OR comment_id OR topic_id,其他两个id字段为NULL。
因此,如果post_id = 55,comment_id = NULL,topic_id = NULL我得到这个:
Array
(
[0] => Array
(
[Activity] => Array
(
[id] => 1
[post_id] => 55
[comment_id] =>
[topic_id] =>
)
[Post] => Array
(
[id] => 55
[name] => Post #1
[description] => This is Post #1.
...
)
[Comment] => Array
(
[id] =>
[post_id] =>
[titel] =>
[description] =>
...
[created] =>
[modified] =>
)
[Topic] => Array
(
[id] =>
...
[created] =>
[modified] =>
)
)
[1] => Array
(
...
只有在引用标识为NOT NULL时才有加入的方法吗?我不想在使用php for-each循环查找之后杀死空数组。
另一个想法是这个数据库表:id | activitytype_id | refid加入动态绑定必要的表,具体取决于activitytype_id。 - 这没效果......
这就是我想要的 - 可能吗?
Array
(
[0] => Array
(
[Activity] => Array
(
[id] => 1
[post_id] => 55
[comment_id] =>
[topic_id] =>
)
[Post] => Array
(
[id] => 55
[name] => Post #1
[description] => This is Post #1.
...
)
)
[1] => Array
(
[Activity] => Array
(
[id] => 2
[post_id] =>
[comment_id] => 2
[topic_id] =>
)
[Comment] => Array
(
[id] => 2
[post_id] => 4
[titel] => Blabla
[description] => This is the comment description
...
[created] => 2011-01-01 01:30:00
[modified] => 2011-01-01 01:30:00
)
)
[2] => Array
(
...
提前致谢! : - )
答案 0 :(得分:2)
您需要查询数据库以找出哪些ID为null
,然后再次查询数据库以获取相关数据。
$activity = $this->Activity->read(null, 1);
// some logic to find foreign key with non-null value
$activity[$model] = $this->{$model}->read(null, $id);
我不会浪费你的时间写两个问题;让CakePHP在单个查询中获取所有结果。 :)
$activity = $this->Activity->findById(1);
只需将其添加到模型中即可从结果中过滤掉空值:
public function afterFind($results, $primary = false) {
return Hash::filter($results);
}
答案 1 :(得分:0)
您始终可以手动进行连接。你想要的是INNER JOIN而不是蛋糕完成的LEFT JOIN。你也可以做一个afterFind()来删除这样的东西。
在模型中使用find方法
function afterFind($results){
foreach($results as $k => $result){
if (empty($result['Post']['id'])){
unset($results[$k]['Post']);
}
if (empty($result['Comment']['id'])){
unset($results[$k]['Comment']);
}
if (empty($result['Topic']['id'])){
unset($results[$k]['Topic']);
}
}
}
虽然联接是一个更直接的解决方案。