基于关系的Laravel查询构建

时间:2014-11-15 18:26:58

标签: mysql laravel relation

我有这样的疑问:

Tournament::has('participations', '<', '2')->get();

如何更换常数&#39; 2&#39;在锦标赛的专栏名单中?我想只检索参赛人数少于锦标赛参赛人数的锦标赛。

1 个答案:

答案 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过滤。