Mysql CakePHP2.2.4:为什么这个联合$this->Model->query不起作用?

Mysql CakePHP2.2.4:为什么这个联合$this->Model->query不起作用?,mysql,cakephp,union,cakephp-2.1,Mysql,Cakephp,Union,Cakephp 2.1,我在photocontroller.php的视图操作中。我想要做的是给出当前照片的ID我正在观看,创建一张包含两张照片的照片的旋转木马和两张照片在当前照片与当前照片在中间5总共。< / P> 有人指着我,但我似乎无法使用$this->Photo->query将其转换为CakePHP 我的控制器 $this->set('photos', $this->Photo->query(" SELECT id, file FROM photos WHERE id <= $id

我在photocontroller.php的视图操作中。我想要做的是给出当前照片的ID我正在观看,创建一张包含两张照片的照片的旋转木马和两张照片在当前照片与当前照片在中间5总共。< / P> 有人指着我,但我似乎无法使用$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、文件和页面id都是照片表中的列。id和$page_id都从路由器传递给操作。我的语法错了吗

编辑:如果我删除UNIONALL和第二条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
)));
我手头有一个contain,只返回我需要的字段和关联模型

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


您必须将模型加载为

  $this->loadModel('Photo');

在执行查询之前。

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


阅读MySQL中创建视图的相关内容,然后基于该视图名称创建模型。

我猜您的原始查询是无效的SQL。Afaik联合不能包含多个“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
虽然我认真地认为这样的查询远远不是最佳的。当然,我不知道您的应用程序是如何工作的,但似乎带有偏移量/限制的标准分页查询是一种更符合逻辑的方法


请考虑我在你的问题下面的评论;使用模型->查询不会自动处理清除/转义以防止SQL注入

您是否创建了模型照片?执行查询时是否出现任何错误?是,照片是一个模型。在呈现我的视图的其余部分时执行查询时,似乎没有错误,只有包含查询的部分表示内部错误发生。如果启用调试,生成的SQL是什么?您是否尝试过在MySQL中运行SQL,例如通过PhpMyAdmin。另外,您使用的是低级“query”方法,它不处理任何转义,因此请非常小心防止SQL注入!我必须这样做,即使我在光电控制器内部,默认情况下已经使用了照片模型?实际上,我甚至有var$uses=array'Photo','PhotoSetting';在我的页面顶部,因此模型已加载。请将链接发布到相关的烹饪书条目或其他指南,好吗?感谢此查询有效,唯一的问题是说I'm view Photo.id=71,查询按原样显示,结果按id的顺序显示:71、70、69、72、73。如果我将suba更改为ORDER BY id ASC,则id的顺序为:1、2、3、72、73。第一个示例包含正确的ID,但顺序不正确。我在找这个订单:69,70,71,72,73。请参阅我的编辑变通方法。它以正确的顺序显示正确的id,但这是两个独立的查询。好的,在subb之后,我在整个联合中添加了一个order BY id ASC,它按预期工作。你的意见是,我应该选择这个->照片->查询还是两个单独的查询?哪一个对性能更好?我会尝试在没有这种复杂查询的情况下实现这一点。我看到了你添加的屏幕截图,我猜你希望每个“秀”显示5张图片。这大概是;显示->有许多->图片。然后选择显示并对图片分页,页面大小为5?我有页面显示,但其他娱乐类别也有许多照片,其中有许多评论,但您的建议不适用于我的应用程序。我不是每页显示5张照片,而是每页最多显示5张照片。我也不确定这是否重要,但我已经在照片缩略图下对评论进行了分页。不确定是否可以在同一视图上有两个不同的分页列表?您显示的屏幕截图是“页面”的,例如,有人选择了“dexter”页面,还是仅显示“任意”照片?这5张照片有什么“关联”吗?如果没有,如何选择“主要”照片?例如,主照片是从“列表”还是通过“展示”选择的?