你好我有以下型号
Restaurant(id, name)
RestaurantMenu(id, name, restaurant_id)
[每家餐厅都有很多主菜单]
RestaurantMenuItem(id, name, restaurant_menu_id)
[每个菜单有很多菜单项]
我需要找到那些至少有1个RestaurantMenu
的RestaurantMenuItem
。如果它没有那么它也不应该得到RestaurantMenu
。它给我空的数组RestaurantMenuItem
,我不想要。我不想要一个空的物体。
$this->Behaviors->attach('Containable');
return $this->find('all', array(
'contain' => array('RestaurantMenu.RestaurantMenuItem'),
'conditions' => array(
'Restaurant.id' => $restaurant_id,
),
'recursive' => 0
));
这可以通过在INNER
收容中应用与RestaurantMenuItem
的RestaurantMenu
连接来实现。这将导致仅在至少存在1个关联的RestaurantMenu
行时才选择RestaurantMenuItem
,这应该满足您的两个条件。
不幸的是,没有joins
和group
选项用于包含,所以必须通过例如手动查询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
关联配置。
也可以看看