таблицы
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'));
несколько идей на первый взгляд:
удачи!
Cuisine
должна быть таблицей (или псевдонимом) в предложении FROM вашего SELECT. поэтому ошибка:
1054: Неизвестная колонка 'Cuisine.name' в 'where clause'
Это просто потому, что на ссылку FROM не ссылается
Если вы удалите часть компонента и события вашей ссылки HABTM в модели ресторана, значит, она работает? Звучит для меня так же, как вы не смогли определить правильные первичные и форсирующие клавиши для модели Cuisine, так как модель HABTM даже не включает в себя вкладку Cuisine в запросе, который вы разместили здесь.