Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel Eloquent-查询生成器无法找到具有函数的列_Php_Mysql_Laravel 5_Eloquent_Laravel Query Builder - Fatal编程技术网

Php Laravel Eloquent-查询生成器无法找到具有函数的列

Php Laravel Eloquent-查询生成器无法找到具有函数的列,php,mysql,laravel-5,eloquent,laravel-query-builder,Php,Mysql,Laravel 5,Eloquent,Laravel Query Builder,我有一个数据透视表“游戏类型”(带有游戏id和类型id)。游戏和流派模型有一种类似于下面示例的归属关系 我一直在尝试收集同时包含60和55种游戏类型的游戏。我使用下面的SQL查询得到了正确的结果,但是当使用下面的查询生成器时,我在使用having()函数时得到了一个列未找到错误 SQLSTATE[42S22]:未找到列:“having子句”中的1054未知列“genre\u id” 我不知道如何构造查询生成器 型号: class Game extends Model { publ

我有一个数据透视表“游戏类型”(带有游戏id和类型id)。游戏和流派模型有一种类似于下面示例的
归属关系

我一直在尝试收集同时包含60和55种游戏类型的游戏。我使用下面的SQL查询得到了正确的结果,但是当使用下面的查询生成器时,我在使用
having()
函数时得到了一个列未找到错误

SQLSTATE[42S22]:未找到列:“having子句”中的1054未知列“genre\u id”

我不知道如何构造查询生成器

型号:

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

控制器:

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

您忘记了您的
条件中的聚合函数(在本例中为
COUNT
):

$query->where('genre_id', '55')
    ->orWhere('genre_id', '60')
    ->groupBy('game_id')
    ->havingRaw('COUNT(DISTINCT genre_id) = 2');
除了在查询中添加几个
where()
orWhere()
之外,您还可以使用
where()
作为数组:

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

您忘记了您的
条件中的聚合函数(在本例中为
COUNT
):

$query->where('genre_id', '55')
    ->orWhere('genre_id', '60')
    ->groupBy('game_id')
    ->havingRaw('COUNT(DISTINCT genre_id) = 2');
除了在查询中添加几个
where()
orWhere()
之外,您还可以使用
where()
作为数组:

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

您可以使用以下查询获取包含
60
55
genre\u id
Games

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

您可以使用以下查询获取包含
60
55
genre\u id
Games

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

->具有('type_id','=',2);如果你想获得gener_jd 60&55的游戏,你应该->拥有('genre_id','=',2)或者尝试->havingRaw('genre_id=2');您可以在游戏模型中放置一个关系函数(genr),其中put语句返回$this->belongstomy(genr::class,'Game_genr');然后尝试从这个查询中获取结果$games=Game::genr()->where('genr_id',55)->或者where('genr_id',60)->get();确保将关系函数作为静态函数放置,否则必须对对象调用关系函数@DevinGray-我试图排除
having()
函数的code>,但它会创建语法错误。
havingRaw()
函数只会创建与标准函数相同的错误结果。@AmitKumar-好的,我尝试了你的方法,但我不确定如何使它静态工作,从对象调用只输出
未定义的方法
…你能不能进行Ellobrate,或提供示例plz?->具有('genre\u id','=',2);如果你想获得gener_jd 60&55的游戏,你应该->拥有('genre_id','=',2)或者尝试->havingRaw('genre_id=2');您可以在游戏模型中放置一个关系函数(genr),其中put语句返回$this->belongstomy(genr::class,'Game_genr');然后尝试从这个查询中获取结果$games=Game::genr()->where('genr_id',55)->或者where('genr_id',60)->get();确保将关系函数作为静态函数放置,否则必须对对象调用关系函数@DevinGray-我试图排除
having()
函数的code>,但它会创建语法错误。
havingRaw()
函数只会创建与标准方法相同的错误结果。@AmitKumar-好的,我尝试了你的方法,但我不确定如何使它静态工作,从对象调用只输出
未定义的方法
…你能不能,或者提供示例plz?这似乎比重复类似Amits方法的
whereHas()
稍微整洁一些,我倾向于使用这个方法。我想知道您是否知道原始sql为什么工作,并且使用标准的
having()
函数不会检测列?@orbit我猜您的
选择列表中没有
类型id
<代码>HAVING
只能使用
SELECT
列表中、
GROUP BY
子句中或在聚合函数中使用的列。@Orbitall oh和标准
HAVING()
在这种情况下不起作用,因为它只使用列名作为第一个参数。这意味着你不能使用
COUNT
,这就是为什么你需要使用
havingRaw()
。谢谢,很好的解释…尽管我发现Amits方法在foreach循环中更有用,例如($ids=[55,60])。当我将您的添加到foreach时,得到的响应是带有其中一个ID而不是两个ID的游戏。你能告诉我如何修改你的方法来做到这一点吗?这似乎比重复一个类似Amits方法的
whereHas()
略为简洁,我倾向于使用这个方法。我想知道您是否知道原始sql为什么工作,并且使用标准的
having()
函数不会检测列?@orbit我猜您的
选择列表中没有
类型id
<代码>HAVING
只能使用
SELECT
列表中、
GROUP BY
子句中或在聚合函数中使用的列。@Orbitall oh和标准
HAVING()
在这种情况下不起作用,因为它只使用列名作为第一个参数。这意味着你不能使用
COUNT
,这就是为什么你需要使用
havingRaw()
。谢谢,很好的解释…尽管我发现Amits方法在foreach循环中更有用,例如($ids=[55,60])。当我将您的添加到foreach时,得到的响应是带有其中一个ID而不是两个ID的游戏。你能告诉我如何修改你的方法来做到这一点吗?这个方法看起来比
havingRaw()
方法在循环中工作得更好。这个方法看起来比
havingRaw()
方法在循环中工作得更好。