CakePHP – проблема с запросом paginate HABTM

таблицы

restaurants cuisines cuisines_restaurants 

Обе модели ресторана и кухни настроены для HABTM друг друга.

Я пытаюсь получить разбитый список ресторанов, где Cuisine.name = 'italian' (пример), но продолжайте получать эту ошибку:

 1054: Unknown column 'Cuisine.name' in 'where clause' 

Фактический запрос:

 SELECT `Restaurant`.`id`, `Restaurant`.`type` ..... `Restaurant`.`modified`, `Restaurant`.`user_id`, `User`.`display_name`, `User`.`username`, `User`.`id`, `City`.`id`,`City`.`lat` ..... FROM `restaurants` AS `Restaurant` LEFT JOIN `users` AS `User` ON (`Restaurant`.`user_id` = `User`.`id`) LEFT JOIN `cities` AS `City` ON (`Restaurant`.`city_id` = `City`.`id`) WHERE `Cuisine`.`name` = 'italian' LIMIT 10 

Части «…..» – это просто дополнительные поля, которые я удалил, чтобы сократить запрос, чтобы показать вам.

Я не профессионал CakePHP, поэтому, надеюсь, есть какая-то вопиющая ошибка. Я называю paginate следующим образом:

 $this->paginate = array( 'conditions' => $opts, 'limit' => 10, ); $data = $this->paginate('Restaurant'); $this->set('data', $data); 

$ opts – это набор опций, один из которых – 'Cuisine.name' => 'italian'

Я также попытался установить $ this-> Restaurant-> recursive = 2; но это, казалось, ничего не делало (и я полагаю, что мне не нужно это делать?)

Любая помощь или руководство очень ценится.


РЕДАКТИРОВАТЬ

 models/cuisine.php var $hasAndBelongsToMany = array('Restaurant'); models/restaurant.php var $hasAndBelongsToMany = array( 'Cuisine' => array( 'order' => 'Cuisine.name ASC' ), 'Feature' => array( 'order' => 'Feature.name ASC' ), 'Event' => array( 'order' => 'Event.start_date ASC' ) ); 

Это терпит неудачу, потому что Cake фактически использует 2 разных запроса для генерации вашего набора результатов. Как вы заметили, первый запрос даже не содержит ссылки на Cuisine.

Как пояснил @vindia, использование Containable поведения обычно устраняет эту проблему, но не работает с Paginate .

В принципе, вам нужен способ заставить Cake посмотреть на кухню во время первого запроса. Это не так, как обычно делает структура, поэтому она, к сожалению, требует создания соединения вручную . paginate использует те же опции, что и Model->find('all') . Здесь нам нужно использовать параметр joins .

 var $joins = array( array( 'table' => '(SELECT cuisines.id, cuisines.name, cuisines_restaurants.restaurant_id FROM cuisines_restaurants JOIN cuisines ON cuisines_restaurants.cuisines_id = cuisines.id)', 'alias' => 'Cuisine', 'conditions' => array( 'Cuisine.restaurant_id = Restaurant.id', 'Cuisine.name = "italian"' ) ) ); $this->paginate = array( 'conditions' => $opts, 'limit' => 10, 'joins' => $joins ); 

Это решение намного clunkier чем другие, но имеет преимущество работы.

Как объяснено в этом blogpost мной, вы должны поместить условие соответствующей модели в опцию сохранения вашего массива разбиения на страницы.

Так что что-то вроде этого должно работать

 # in your restaurant_controller.php var $paginate = array( 'contain' => array( 'Cuisine' => array( 'conditions' => array('Cuisine.name' => 'italian') ) ), 'limit' => 10 ); # then, in your method (ie. index.php) $this->set('restaurants', $this->paginate('Restaurant')); 

несколько идей на первый взгляд:

  • вы проверили модель, чтобы узнать, хорошо ли объявлен HABTM?
  • попробуйте использовать сдерживаемое поведение
  • ни в одной из этих работ .. тогда вы всегда могли бы строить соединения для paginator вручную

удачи!

Cuisine должна быть таблицей (или псевдонимом) в предложении FROM вашего SELECT. поэтому ошибка:
1054: Неизвестная колонка 'Cuisine.name' в 'where clause'
Это просто потому, что на ссылку FROM не ссылается

Если вы удалите часть компонента и события вашей ссылки HABTM в модели ресторана, значит, она работает? Звучит для меня так же, как вы не смогли определить правильные первичные и форсирующие клавиши для модели Cuisine, так как модель HABTM даже не включает в себя вкладку Cuisine в запросе, который вы разместили здесь.