我正在使用PhotosController.php的视图操作。我想要做的是给出我正在查看的当前照片的ID,创建包含之前两张照片的照片旋转木马和当前照片之后的两张照片,中间是当前照片(总共5张)。
我被指向this solution,但我似乎无法使用$ this-> Photo->查询将其转换为CakePHP。
我的控制器
$this->set('photos', $this->Photo->query("
SELECT id, file FROM photos WHERE id <= $id AND page_id = $page_id ORDER BY id DESC LIMIT 3
UNION ALL
SELECT id, file FROM photos WHERE id > $id AND page_id = $page_id ORDER BY id ASC LIMIT 2
"));
不幸的是,当我打开调试时没有看到任何内容。 id,file和page_id都是照片表中的列。 #id和$ page_id都从路由器传递给操作。我的语法错了吗?
编辑:如果我删除了UNION ALL和第二个SELECT语句,那么查询工作正常,因此没有加载模型的问题,因为它是。
编辑(解决方法):目前我正在做两个不理想的查询。
$this->set('photos_before', $this->Photo->find('all', array(
'conditions' => array(
'Photo.page_id' => $page_id,
'Photo.id <' => $id
),
'order' => array('Photo.id ASC'),
'limit' => 2
)));
$this->set('photos_after', $this->Photo->find('all', array(
'conditions' => array(
'Photo.page_id' => $page_id,
'Photo.id >' => $id
),
'order' => array('Photo.id ASC'),
'limit' => 2
)));
我手边有一个只能返回我需要的字段和相关模型。
下面是我想要显示的内容,它目前使用上面的两个查询,但我希望这可以通过一个Cake友好的查询来实现
答案 0 :(得分:2)
我的猜测是您的原始查询是无效的SQL。 Afaik UNIONS不能包含多个'order by'子句。作为一种解决方法,您可以考虑重写它以使用这样的子查询:
SELECT * FROM (SELECT id, file FROM photos WHERE id <= $id AND page_id = $page_id ORDER BY id DESC LIMIT 3) AS suba
UNION ALL
SELECT * FROM (SELECT id, file FROM photos WHERE id > $id AND page_id = $page_id ORDER BY id ASC LIMIT 2) AS subb
虽然我认真地认为像这样的查询远非最佳。当然,我不知道您的应用程序的工作方式,但似乎标准的分页查询,使用OFFSET / LIMIT是一种更合乎逻辑的方法。
请将我的评论考虑在您的问题下面;使用model-&gt;查询不会自动处理清除/转义以防止SQL注入!
答案 1 :(得分:0)
您必须将模型加载为
$this->loadModel('Photo');
在执行查询之前。
答案 2 :(得分:0)
您应该在MySQL中创建一个VIEW,然后将其用作模型,并在其上进行传统的CakePHP查找。
阅读在MySQL中创建视图,然后根据该视图名称创建模型。