CakePHP - проблема с поисковым запросом HABTM - PullRequest
5 голосов
/ 14 апреля 2011

Столы

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, так что, надеюсь, есть какая-то явная ошибка. Я называю пагинат так:

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

$ opts - это массив опций, одним из которых является «Cuisine.name» => «итальянский»

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

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


EDIT

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'
    )
);

Ответы [ 5 ]

6 голосов
/ 20 апреля 2011

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

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

# 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'));
5 голосов
/ 25 апреля 2011

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

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

По сути, вам нужен способ заставить Cake посмотреть на Kitchen во время первого запроса. Фреймворк обычно так не работает, поэтому, к сожалению, требуется построение соединения вручную , 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
);

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

0 голосов
/ 24 апреля 2011

Если вы удалите часть «Особенность» и «Событие» вашей ссылки HABTM в модели «Ресторан», будет ли она работать тогда? Похоже, вы не смогли определить правильные первичные и внешние ключи для модели «Кухня», поскольку модель HABTM даже не включает табель «Кухня» в запрос, который вы разместили здесь.

0 голосов
/ 20 апреля 2011

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

0 голосов
/ 14 апреля 2011

несколько идей на моей голове:

удачи!

...