我有这样的疑问:
Tournament::has('participations', '<', '2')->get();
如何更换常数&#39; 2&#39;在锦标赛的专栏名单中?我想只检索参赛人数少于锦标赛参赛人数的锦标赛。
答案 0 :(得分:3)
让我们首先使用列名而不是“2”。就像你在“普通”SQL中所做的那样
Tournament::has('participations', '<', 'slots')->get();
现在,您甚至不必尝试,因为它不起作用。但为什么呢?因为Laravel将slots
视为一个字符串并将其转义,所以SQL也会这样做。
您需要做的是使用DB::raw()
。 raw
确保Laravel不做任何更改,只是将其注入SQL查询
Tournament::has('participations', '<', DB::raw('slots'))->get();
经过一些尝试后,我发现了这个:(它不是很漂亮但是我能让它工作的唯一方法)
$subquery = function($q) use ($uid){
$q->where('player_id', $uid);
}
Tournament::whereHas('participations', $subquery)
->whereHas('participations', $subquery, '<', DB::raw('slots'))
->get();
第一次whereAs
检查count(*) > 0
,第二次count(*) < slots
和子查询按玩家ID过滤。