我有一个MySQL查询,我想用Laravel 5的Query Builder格式实现。
我有表Items和FaceOff。在我的Laravel控制器中,我引用了名称空间/ Items和namespace / FaceOff模型。
查询:
select i1.id as id1, i2.id as id2
from items i1
join
items i2
left join
faceoff f
on (f.wonid = i1.id and f.lostid = i2.id and userid = '1') or
(f.wonid = i2.id and f.lostid = i1.id and userid = '1')
where f.wonid is null and i1.id <> i2.id
order by rand()
limit 1;
我遇到的问题是如何加入嵌套查询以及为表使用别名。例如,这个简单的查询:
$items = Items::select('id as id1')
我可以为列名添加别名,但不知道如何为整个查询的结果添加别名。
简而言之,我正试图抓住两个未经“头对头”面对的随机物品。将其视为与两个竞争对手配对 - 每个竞争对手应该只支付一次其他竞争对手。因此,查询应返回ID1和ID2。这些应该是不同的ID,并且没有相互赢得也没有。
问题:
有人可以帮我翻译成Laravel的查询构建器格式吗?我怀疑我必须使用DB :: raw表达式。
我已经尝试过并且未能使用DB :: Raw表达式,这表示没有包含DB模型的错误。我也犹豫是否打开系统进行SQL注入,无论如何都在努力解决连接问题。
感谢一位迷路的人。
答案 0 :(得分:3)
代码中唯一棘手的部分是异常join
。其他部分只是简单的Query\Builder
方法:
// you could use model query, but it makes little sense in this case
// Items::from('items as i1')->join...
DB::table('items as i1')
->join( DB::raw('items as i2 left join faceoff as f'), function ($j) {
$j->on('f.wonid', '=', 'i1.id')
->on('f.lostid', '=', 'i2.id')
->where('userid', '=', 1)
->orOn('f.wonid', '=', 'i2.id')
->on('f.lostid', '=', 'i1.id')
->where('userid', '=', 1);
})->whereNull('f.wonid')
->where('i1.id', '<>', 'i2.id')
->orderByRaw('rand()')
->take(1)
->select('i1.id as id1', 'i2.id as id2')
->get();