0

我有以下表格:

- 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)然后使用包含来获取有序列表是否是正确的方法?我认为这可行,但我认为还有更简单的方法,对吧?

欢迎任何帮助!谢谢你。

4

2 回答 2

0

如果您使用的是 CakePHP 的 ORM 机器,您应该有一个 Restaurant 模型和一个 Menu 模型来描述每个表。在 Restaurant 模型中,您应该有一个$hasMany = "Menu"字段,在 menu 中应该有一个$belongsTo = "Restaurant"字段(假设模型名称是Menuand 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));

控制器的 ad-hoc 方法中的上述内容Restaurant应将行检索为Restaurant对象数组,每个对象都与一个 active 数组捆绑在一起Menu

于 2013-03-23T11:00:04.950 回答
0

现在我找到了解决我问题的简单而干净的解决方案!是的!

首先我必须解除绑定,然后我必须使用条件进行新的绑定。它就像一个魅力。这是代码:

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

我感谢大家的回答!

于 2013-03-24T13:50:22.043 回答