我有一个包含20多列的Venue
表。
我还有一个带{<1}}列的表
favorite_venues
这是我获取场地的代码
id | userId | venueId
我想添加一个条件,如果我发送userId,它应该检查每个场地是否添加到收藏夹列表并设置
$this->Venue->virtualFields = array(
'bookedCount' => "SELECT count(*) FROM bookings WHERE venueId = Venue.id"
);
$result = $this->Venue->find('all', array('conditions'=>$conditions,
'order' => array('Venue.bookedCount DESC'),
'limit' => 20,
'offset' => $offset * 20
));
我不想要一个for循环并检查我得到的每个场地。有什么方法可以在cakephp中加入相同的Mysql查询。我不确定如何将是/否作为虚拟字段
答案 0 :(得分:0)
您可以LEFT
加入favorite_venues
表,然后例如在虚拟字段中使用CASE
语句来检查是否存在链接的行。
这是一个未经测试的例子来说明我的意思。我不知道如何使用用户ID,所以你必须自己解决这个问题。
$this->Venue->virtualFields = array(
'bookedCount' => "SELECT count(*) FROM bookings WHERE venueId = Venue.id",
'isFavorite' => 'CASE WHEN FavoriteVenues.id IS NOT NULL THEN "yes" ELSE "no" END'
);
$result = $this->Venue->find('all', array(
'conditions' => $conditions,
'order' => array('Venue.bookedCount DESC'),
'limit' => 20,
'offset' => $offset * 20,
'joins' => array(
array(
'table' => 'favorite_venues',
'alias' => 'FavoriteVenues',
'type' => 'LEFT',
'conditions' => array(
'FavoriteVenues.venueId = Venue.id',
)
)
),
// don't forget to group to prevent duplicate results
'group' => 'Venue.id'
));
另见