找到使用包含条件

问题描述 投票:1回答:1

你好我有以下型号

Restaurant(id, name) RestaurantMenu(id, name, restaurant_id) [每家餐厅都有很多主菜单] RestaurantMenuItem(id, name, restaurant_menu_id) [每个菜单有很多菜单项]

我需要找到那些至少有1个RestaurantMenuRestaurantMenuItem。如果它没有那么它也不应该得到RestaurantMenu。它给我空的数组RestaurantMenuItem,我不想要。我不想要一个空的物体。

$this->Behaviors->attach('Containable');

return $this->find('all', array(
    'contain' => array('RestaurantMenu.RestaurantMenuItem'),
    'conditions' => array(
        'Restaurant.id' => $restaurant_id,
    ),
    'recursive' => 0
));
php cakephp cakephp-2.0 cakephp-2.3
1个回答
0
投票

这可以通过在INNER收容中应用与RestaurantMenuItemRestaurantMenu连接来实现。这将导致仅在至少存在1个关联的RestaurantMenu行时才选择RestaurantMenuItem,这应该满足您的两个条件。

不幸的是,没有joinsgroup选项用于包含,所以必须通过例如手动查询RestaurantMenu数据来解决这个问题,这在你的情况下应该很容易,因为你只选择一个Restaurant(顺便说一句,你应该使用在这种情况下,first finder而不是all):

$restaurant = $this->find('first', array(
    'conditions' => array(
        'Restaurant.id' => $restaurant_id,
    ),
    'recursive' => 0
));

if ($restaurant) {
    // RestaurantMenu needs to have the containable behavior attached
    // in order for this to work
    $restaurant['RestaurantMenu'] = $this->RestaurantMenu->find('all', array(
        'contain' => array(
            'RestaurantMenuItem'
        ),
        'joins' => array(
            array(
                'table' => 'restaurant_menu_item',
                'alias' => 'RestaurantMenuItem',
                'type' => 'INNER',
                'conditions' => array(
                    'RestaurantMenu.id = RestaurantMenuItem.restaurant_menu_id'
                )
            )
        ),
        'conditions' => array(
            'RestaurantMenu.restaurant_id' => $restaurant_id,
        ),
        'group' => array(
            'RestaurantMenu.id'
        )
    ));
}

return $restaurant;

或者使用finderQuery选项定义包含连接的自定义查询:

return $this->find('all', array(
    'contain' => array(
        'RestaurantMenu' => array(
            'finderQuery' => '
                SELECT
                  RestaurantMenu.*
                FROM
                    restaurant_menus AS RestaurantMenu
                INNER JOIN
                  restaurant_menu_items AS RestaurantMenuItem ON
                    RestaurantMenuItem.restaurant_menu_id = RestaurantMenu.id
                WHERE
                  RestaurantMenu.restaurant_id IN ({$__cakeID__$})
                GROUP BY
                  RestaurantMenu.id
            ',
            'RestaurantMenuItem'
        )
    ),
    'conditions' => array(
        'Restaurant.id' => $restaurant_id,
    )
));

这也可以应用于RestaurantMenu模型中的Restaurant关联配置。

也可以看看

© www.soinside.com 2019 - 2024. All rights reserved.