【问题标题】:CakePHP Conditions on deep model associationsCakePHP 关于深度模型关联的条件
【发布时间】:2012-01-05 04:54:56
【问题描述】:

使用 CakePHP 1.3,我有一个 Find 语句,其中包含 3 级深度关联的条件: 酒店 > 房间 > 房间类型 > 名称

我希望我的 Find 语句只返回 RoomType 名称为“Suite”的酒店。

我相信下面的代码应该可以工作,但它没有,说明 SQL 语法错误:

$this->Hotel->find('first', array(
    'contain' => array('Room' => array('RoomType')),
    'conditions' => array(
        'Hotel.Room.RoomType.name' => 'Suite' 
    ),
));

请注意,酒店会有很多房间,但每个房间只有 1 个房间类型

我已经阅读了有关在 contains 语句中使用条件的信息,但这仅限制了返回的 RoomTypes,而不是整个酒店。

我在这里看到过类似的问题,但我还没有找到似乎可以解决此问题的问题。

【问题讨论】:

    标签: cakephp cakephp-1.3 conditional-statements contain


    【解决方案1】:

    您需要手动创建连接和条件作为查询的一部分:

    $this->Hotel->find('first', array(
        'contain'=>array(
            'Room'=>array(
                'RoomType'
            )
        ),
        'joins'=>array(
            array(
                 'table'=>'rooms',
                 'alias'=>'Room',
                 'type'=>'inner',
                 'conditions'=>array(
                      'Room.hotel_id'=>'Hotel.id'
                 )
            ),
            array(
                'table'=>'room_types',
                'alias'=>'RoomType',
                'type'=>'inner',
                'conditions'=>array(
                    'RoomType.id'=>'Room.room_type_id',
                    'RoomType.name=>'Suit'
                )
            )
        )
    );
    

    【讨论】:

    • 这对我使用 cake 2.x 有效,但是我必须将外键关联条件指定为字符串,而不是使用数组语法。所以'Room.hotel_id'=>'Hotel.id'变成'Room.hotel_id = Hotel.id'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2023-04-03
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多