Laravel Eloquent - 查询构建器无法找到具有函数

时间:2016-11-16 12:04:02

标签: php mysql laravel-5 eloquent laravel-query-builder

我有一个数据透视表' game_genre'(使用game_id和genre_id)。游戏和流派模型的belongsToMany关系类似于以下示例。

我一直在尝试收集同时包含60和55的genre_id的游戏。我使用以下SQL查询获得了正确的结果,但在使用以下查询构建器时,我最终在使用having()函数时收到列未找到错误。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'genre_id' in 'having clause'

我不确定如何构建查询构建器?

MODEL:

class Game extends Model
{    
    public function genres()
    {
         return $this->belongsToMany('App\Genre');
    }
}

SQL:

SELECT *
FROM game_genre
WHERE genre_id = 55 OR genre_id = 60
GROUP BY game_id
HAVING COUNT(DISTINCT genre_id) = 2;

控制器:

$game = Game::whereHas('genres', function ($query)
{
    $query->where('genre_id', '55')
        ->orWhere('genre_id', '60')
        ->groupBy('game_id')
        ->having('genre_id','=', 2);
})->get();

2 个答案:

答案 0 :(得分:4)

您忘记了COUNT条件中的汇总功能(在本例中为HAVING):

$query->where('genre_id', '55')
    ->orWhere('genre_id', '60')
    ->groupBy('game_id')
    ->havingRaw('COUNT(DISTINCT genre_id) = 2');

您可以使用带有数组的where(),而不是在查询中添加多个orWhere()whereIn()

$myArray = [55,60];
$query->whereIn('genre_id', $myArray)
    ->groupBy('game_id')
    ->havingRaw('COUNT(DISTINCT genre_id) = 2');

答案 1 :(得分:0)

您可以使用以下查询来获取Games genre_id 6055的{​​{1}}:

$games = Game::whereHas('genres', function ($query) {
                $query->where('genre_id', '55');
            })
            ->whereHas('genres', function ($query) {
                $query->where('genre_id', '60');
            })
            ->get();