检查所选行是否是用户在cakephp中的最爱

时间:2017-09-12 04:56:39

标签: php mysql cakephp

我有一个包含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查询。我不确定如何将是/否作为虚拟字段

1 个答案:

答案 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'
));

另见