CakePHP sql-запрос

У меня есть следующие таблицы:

- restaurants (restaurant.id, restaurant.name)
- menus (menu.id, menu.name, menu.active, menu.restaurant_id)

Я хочу иметь список всех ресторанов с активными меню (menu.active = true):

- restaurant2
    - menu1
    - menu4
- restaurant5
    -menu3
- restaurant19
    - menu34
    - menu33

Моей первой идеей было что-то вроде этого:

$options['contain'] = array(
    'Menu' => array(
        'conditions' => $menuParams //array('Menu.active' => '1') //$menuParams
        )
     );

Это не работает, потому что все рестораны будут перечислены. Я хочу иметь только рестораны с активным меню.

Следующая идея: использование соединения

$options['joins'] = array(
        array('table' => 'menus',
            'alias' => 'Menu',
            'type' => 'RIGHT',
            'conditions' => array(
                'Menu.restaurant_id = Restaurant.id',
            )
        )
    );

Не хорошо, потому что у меня нет упорядоченного списка, который я хочу. Мне нужно меню, сгруппированные по ресторану. Смотреть выше.

Это правильный способ сделать соединение с ресторанами и меню (active = true), а затем с помощью содержимого получить упорядоченный список? Я думаю, что это может сработать, но я думаю, что есть более простой способ, верно?

Любая помощь приветствуется! Спасибо.

2 ответа

Теперь я нашел простое и чистое решение для моей проблемы! Да уж!

Сначала я должен был развязать привязки, а затем я должен был сделать новую привязку с условием. Отлично работает. Вот код:

        $this->unbindModel(array('hasMany' => array('Menu')));
        $this->bindModel(array('hasMany'=>array(
            'Menu'=>array(
                'foreignKey' => 'restaurant_id',
                'conditions' => array(
                                    'Menu.active' => 1
                                    )
            )
        )));

Я благодарю вас всех за ваши ответы!

Если вы используете механизм ORM от CakePHP, у вас должна быть модель ресторана и модель меню для описания каждой таблицы. В модели ресторана у вас должен быть $hasMany = "Menu" поле и в меню $belongsTo = "Restaurant" поле (при условии, что названия моделей Menu а также Restaurant).

С этого момента выполнение запросов с использованием ORM довольно просто:

$this->Restaurant->recursive = 1; // grab the menus
$conditions = array('Menu.active' => '1'); // restrict to active menus only
$this->Restaurant->find('all', array('conditions' => $conditions));

Выше в специальном методе Restaurant Контроллер должен получить строки в виде массива Restaurant объекты, каждый в комплекте с массивом активных Menu,

Другие вопросы по тегам