CakePHP 2.2.4:为什么这个Union $ this-> Model->查询不起作用?

时间:2013-02-22 14:20:12

标签: mysql cakephp union cakephp-2.1

我正在使用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友好的查询来实现

This what I want to be displayed and it currently works using the two queries above but I am hoping this can be achieved with a single, Cake-friendly query

3 个答案:

答案 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中创建视图,然后根据该视图名称创建模型。