2013-02-22 2 views
0

Я нахожусь в действии своих фотографий с помощью PictureController.php. То, что я хочу сделать, - это указать идентификатор текущей фотографии, которую я просматриваю, создать карусель фотографий, содержащих две фотографии, и две фотографии после текущей фотографии с текущей фотографией посередине (всего 5).

Я указал на this solution, но я не могу преобразовать его в CakePHP, используя $ this-> Photo-> query.

Мой контроллер

$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 передаются в действие с маршрутизатора. Является ли мой синтаксис неправильным?

EDIT: Если я удалю UNION ALL и второй оператор SELECT, тогда запрос работает нормально, поэтому это не проблема с тем, что модель не загружается, потому что это так.

EDIT (обходной путь): На данный момент я делаю два запроса, которые не являются идеальными.

$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

+0

Вы создали модель Фото? – sandip

+0

Возникает ли ошибка при выполнении запроса? –

+0

Да Фотография - это модель. Кажется, что ошибка не выполняется, когда запрос выполняется, когда отображается остальная часть моего представления, только раздел, содержащий запрос, говорит «Внутренняя ошибка возникла» – bowlerae

ответ

2

Я предполагаю, что ваш исходный запрос является недопустимым SQL. Afaik UNIONS не может содержать несколько предложений по порядку. В качестве временного решения можно рассмотреть, чтобы переписать его использовать подзапросы, как это:

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-> НЕ автоматически обрабатывает санитацию/экранирование, чтобы предотвратить инъекции SQL!

+0

Этот запрос работает, единственная проблема заключается в том, что я вижу Photo.id = 71, с запросом, как и результаты отображаются с этим порядком идентификаторов: 71, 70, 69, 72, 73. Если я изменил " suba "в ORDER BY id ASC, порядок идентификаторов: 1, 2, 3, 72, 73. Первый пример содержит правильные идентификаторы, но неправильный порядок. Я ищу этот порядок: 69, 70, 71, 72, 73. Пожалуйста, см. Мой «обходной способ» редактирования. Он отображает правильные идентификаторы в правильном порядке, но это два отдельных запроса. – bowlerae

+0

Итак, ПОСЛЕ "subb", я добавил ORDER BY id ASC ко всему объединению и работает так, как ожидалось. Ваше мнение, должен ли я пойти с этим вопросом -> Фото-> или двумя моими отдельными запросами? Что было бы лучше для производительности? – bowlerae

+0

Я бы постарался добиться этого без таких сложных запросов. Я вижу скриншот, который вы добавили, и я предполагаю, что вы хотите показать 5 снимков за «показ». Это будет что-то вроде; показать -> hasMany-> изображения. Затем выберите шоу и выполните разбиение на страницы изображений с размером страницы 5? – thaJeztah

0

Вы должны загрузить модель как

$this->loadModel('Photo'); 

Перед выполнением запроса.

+0

Мне нужно это сделать, хотя я INSIDE из PhotoController который по умолчанию уже использует модель Photo? – bowlerae

+0

На самом деле, у меня даже есть 'var $ uses = array ('Photo', 'PhotoSetting');' наверху моей страницы, так что модель уже загружена. – bowlerae

0

Вы должны создать VIEW в MySQL, а затем использовать это как модель и сделать традиционную CakePHP-находку.

Ознакомьтесь с созданием представлений в MySQL и затем создайте модель, основанную на этом имени представления.

+0

Не могли бы вы разместить ссылку на соответствующую запись в книге Кука или в другом руководстве? Спасибо – bowlerae

 Смежные вопросы

  • Нет связанных вопросов^_^