0

我在我的 PhotosController.php 的视图操作中。我想要做的是给定我正在查看的当前照片的 id,创建一个照片轮播,其中包含当前照片之前的两张照片和当前照片之后的两张照片,当前照片在中间(总共 5 张)。

我被指出了这个解决方案,但我似乎无法使用 $this->Photo->query 将其转换为 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 都是 photos 表中的列。#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
)));

我事先有一个包含只返回我需要的字段和相关模型。

下面是我想要显示的内容,它目前使用上面的两个查询工作,但我希望这可以通过一个对蛋糕友好的查询来实现

这是我想要显示的内容,它目前使用上面的两个查询工作,但我希望这可以通过一个对蛋糕友好的查询来实现

4

3 回答 3

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->query 不会自动处理清理/转义以防止 SQL 注入!

于 2013-02-22T21:16:23.180 回答
0

您必须将模型加载为

  $this->loadModel('Photo');

在执行查询之前。

于 2013-02-22T14:29:34.210 回答
0

您应该在 MySQL 中创建一个 VIEW,然后将其用作模型,并在其上执行传统的 CakePHP 查找。

阅读在 MySQL 中创建视图,然后根据该视图名称创建模型。

于 2013-02-22T18:46:11.143 回答