Mysql CakePHP sql查询

Mysql CakePHP sql查询,mysql,cakephp,join,cakephp-2.0,contain,Mysql,Cakephp,Join,Cakephp 2.0,Contain,我有以下表格: - restaurants (restaurant.id, restaurant.name) - menus (menu.id, menu.name, menu.active, menu.restaurant_id) 我想要一个包含所有活动菜单的餐厅的列表(menu.active=true): 我的第一个想法是这样的: $options['contain'] = array( 'Menu' => array( 'conditions' =>

我有以下表格:

- restaurants (restaurant.id, restaurant.name)
- menus (menu.id, menu.name, menu.active, menu.restaurant_id)
我想要一个包含所有活动菜单的餐厅的列表(menu.active=true):

我的第一个想法是这样的:

$options['contain'] = array(
    'Menu' => array(
        'conditions' => $menuParams //array('Menu.active' => '1') //$menuParams
        )
     );
这不起作用,因为所有的餐馆都会被列出来。我只想要有活动菜单的餐馆

下一个想法:使用join

$options['joins'] = array(
        array('table' => 'menus',
            'alias' => 'Menu',
            'type' => 'RIGHT',
            'conditions' => array(
                'Menu.restaurant_id = Restaurant.id',
            )
        )
    );
不好,因为我没有我想要的有序列表。我需要按餐厅分类的菜单。看看上面

这是与餐厅和菜单(active=true)建立连接,然后使用contain获取订单列表的正确方法吗?我想这可能行得通,但我认为还有一个更简单的方法,对吗


欢迎任何帮助!谢谢。

如果您使用的是CakePHP的ORM机器,您应该有一个餐厅模型和一个菜单模型来描述每个桌子。在餐厅模型中,您应该有一个
$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));

上面提到的
餐厅
控制器的特别方法应该以
餐厅
对象数组的形式检索行,每个对象都绑定了一个活动的
菜单数组
现在我找到了一个简单而干净的解决方案!是啊

首先我必须解除绑定,然后我必须使用该条件创建一个新绑定。它就像一个符咒。代码如下:

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

谢谢大家的回答

您需要将
'Menu.active'=>'1'
添加到您显示的
加入
查询中,然后它将为您提供具有活动菜单的餐厅列表,但您为什么要对结果进行分组?是的,没错,我知道。好吧,组是个错误的词。我想展示下表第一列菜单中的餐厅。现在我得到以下内容:餐厅1,菜单1餐厅1,菜单2餐厅2,菜单49餐厅2,菜单22我想要:餐厅1,菜单1,菜单2餐厅2,菜单49,菜单22您需要一个关于
restaurant.id
orderby
子句。实际上,您应该在ORM的某个地方定义一对多关系。我不记得细节了,但是CakePHP应该可以实现,它应该按照请求返回对象。不,ORDER BY不能解决问题。我试着把它写在上面,但新行被删除了。我想要这个方案:restaurant1(menu1,menu2,menu3),restaurant44(menu5,menu8),等等。现在我有:restaurant1(menu1),restaurant1(menu2),restaurant1(menu3),restaurant44(menu5),restaurant44(menu8)。谢谢。我理解cakephp的概念,我拥有所有$belogsTo和$hasMany(我烘焙了代码)。你的解决方案很好,我第一眼就想到了这一点。但我似乎无法执行条件菜单。在该级别上处于活动状态。。。系统显示:Column not found:1054 Unknown Column'菜单。在where子句中处于活动状态“我现在的解决方案是先执行[join],然后执行[contain]。有点复杂,但它可以工作。查询是什么样的?我想在某个地方可以看到调试选项。
        $this->unbindModel(array('hasMany' => array('Menu')));
        $this->bindModel(array('hasMany'=>array(
            'Menu'=>array(
                'foreignKey' => 'restaurant_id',
                'conditions' => array(
                                    'Menu.active' => 1
                                    )
            )
        )));