Php Laravel Eloquent-查询生成器无法找到具有函数的列
我有一个数据透视表“游戏类型”(带有游戏id和类型id)。游戏和流派模型有一种类似于下面示例的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
归属关系
我一直在尝试收集同时包含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()
方法在循环中工作得更好。