【发布时间】:2012-03-29 16:58:12
【问题描述】:
我有一个基于 CakePHP 2.0 的照片博客,其数据结构如下:
POSTS <-habtm-> TAGS <-habtm-> IMAGES
我正在构建一个基于 AJAX 的功能来查找与给定标签匹配的所有博客文章和图像。首次选择标签时,帖子的第 1 页和图像的第 1 页将加载到相邻的面板中。之后,它们可以独立地进行分页。在大多数情况下,这工作正常,除非我正在获取初始数据页。
我在第一次操作中使用了两次paginate()——一次是为了获取我的帖子,第二次是为了获取图片。问题是我为序列中的第二个模型分配给paginate() 的条件被完全忽略了。单独他们都工作正常,并且切换他们的顺序已经证实这对我来说是一个依赖于序列的问题,而不是仅限于一个模型或另一个。
我已经搜索过过去是否有其他人遇到过类似的问题,但这要么是我的一个不寻常的设计选择,要么我没有找到正确的搜索查询。
我的基本$paginate 数组在我的TagsController.php 中声明如下:
public $paginate = array(
"PostsTag" => array(
"limit" => 4,
"order" => "Post.id DESC",
"contain" => array(
"Tag",
"Post" => array("fields" => array(
"id", "title", "created"))
),
"group" => array("Post.id")
),
"ImagesTag" => array(
"limit" => 4,
"order" => "Image.id DESC",
"contain" => array(
"Tag",
"Image" => array("fields" => array(
"id", "title", "url", "created", "gallery"))
),
"group" => array("Image.id")
)
);
在我的主要搜索操作中,我调用了两个私有函数:
$posts = $this->post_pagination($tagIds);
$images = $this->image_pagination($tagIds);
将限制条件添加到$paginate,如下所示:
private function post_pagination($tags, $page = 1) {
$this->paginate['PostsTag']['conditions'] = array(
"status" => 1,
"OR" => array("tag_id" => $tags)
);
$this->paginate['PostsTag']['page'] = $page;
return $this->paginate("PostsTag");
}
private function image_pagination($tags, $page = 1) {
$this->paginate['ImagesTag']['conditions'] = array(
"gallery" => 1,
"OR" => array("tag_id" => $tags)
);
$this->paginate['ImagesTag']['page'] = $page;
return $this->paginate("ImagesTag");
}
Cake 尊重 limit、order、contain 等,没有问题,但将球放在 conditions 上,特别是对于我尝试在第二个页面上分页的任何模型。它反馈给我正确排序的前 4 个结果,但完全未经过滤。我也不认为我有点复杂的conditions 有问题——只要我不破坏语法,我可以在conditions 中输入完全随机的字符串,第二个paginate() 得到相同的结果。
非常感谢任何帮助或建议。
[编辑] 这是第二个paginate() 查询的 SQL 转储:
SELECT `PostsTag`.`id`, `PostsTag`.`post_id`, `PostsTag`.`tag_id`,
`Tag`.`id`, `Tag`.`name`, `Post`.`id`, `Post`.`title`, `Post`.`created`
FROM `posts_tags` AS `PostsTag`
LEFT JOIN `tags` AS `Tag` ON (`PostsTag`.`tag_id` = `Tag`.`id`)
LEFT JOIN `posts` AS `Post` ON (`PostsTag`.`post_id` = `Post`.`id`)
WHERE 1 = 1
GROUP BY `Post`.`id`
ORDER BY `Post`.`id`
DESC LIMIT 4
如您所见,Cake 正在生成 WHERE 1 = 1 来代替我的条件。
【问题讨论】:
-
您是否尝试过在条件数组中使用
'Model.field' => val而不仅仅是'field' => val?所以就像PostTag.status等。 -
你知道,在我睡眼惺忪的那天晚上,我什至没有注意到我忽略了为其中一些条件指定模型,所以谢谢你让我注意到这一点。但是,问题仍然存在。现在我刚刚为第二个 paginate() 手动组装了一个直接的 SQL 查询,它工作正常。虽然我遇到的问题仍然让我感到困惑。
标签: cakephp conditional-statements pagination