【问题标题】:CakePHP sql-queryCakePHP sql 查询
【发布时间】:2013-03-13 05:09:41
【问题描述】:

我有以下表格:

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

欢迎任何帮助!谢谢。

【问题讨论】:

  • 您需要将'Menu.active' => '1' 添加到您显示的JOIN 查询中,然后它会为您提供具有活动菜单的餐厅列表,但是您为什么要将结果分组?跨度>
  • 是的,没错,我知道。好的,组是错误的词。我想向餐厅展示下面第一个列表中的菜单。现在我得到以下内容:餐厅 1,菜单 1 餐厅 1,菜单 2 餐厅 2,菜单 49 餐厅 2,菜单 22 我想要:餐厅 1,菜单 1,菜单 2 餐厅 2,菜单 49,菜单 22
  • 您需要在Restaurant.id 上添加一个ORDER BY 子句。
  • 实际上,您应该在 ORM 的某处定义一对多关系。我不记得细节了,但是使用 CakePHP 应该是可能的,它应该根据请求返回对象。
  • 不,ORDER BY 不能解决问题。我试图在上面写,但新行被删除了。我想要这个方案:restaurant1(menu1,menu2,menu3),restaurant44(menu5,menu8)等。现在我有:restaurant1(menu1),restaurant1(menu2),restaurant1(menu3),restaurant44(menu5),restaurant44(menu8) )。

标签: mysql cakephp join cakephp-2.0 contain


【解决方案1】:

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

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

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

谢谢大家的回答!

【讨论】:

    【解决方案2】:

    如果您使用的是 CakePHP 的 ORM 机制,您应该有一个 Restaurant 模型和一个 Menu 模型来描述每个表。在 Restaurant 模型中,您应该有一个 $hasMany = "Menu" 字段,在菜单中应该有一个 $belongsTo = "Restaurant" 字段(假设模型名称是 MenuRestaurant)。

    从那时起,使用 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 控制器的 ad-hoc 方法中的上述内容应将行检索为 Restaurant 对象的数组,每个对象都与活动的 Menu 数组捆绑在一起。

    【讨论】:

    • 谢谢。我了解 cakephp 的概念,并且我拥有所有 $belogsTo 和 $hasMany(我烘焙了代码)。你的解决方案很好,我一见钟情。但似乎我无法在该级别上执行条件 Menu.active ... 系统说:未找到列:1054 'where 子句'中的未知列'Menu.active'
    • 我现在的解决方案是先执行 [join],然后执行 [contain]。有点复杂,但它有效。
    • 查询是什么样的?我认为在某处可以看到调试选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多