首页 文章

使用带有联接的查询生成器的Laravel 5.0查询

提问于
浏览
0

我有一个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')

我可以为列名称添加别名,但不知道如何为整个查询的结果添加别名 .

简而言之,我试图 grab 2个随意的物品,这些物品在“头对头”的面对面没有遇到 . 将其视为与两个竞争对手配对 - 每个竞争对手应该只支付另一个竞争对手一次 . 因此,查询应返回ID1和ID2 . 那些应该是不同的ID,并且没有相互赢取也没有 .

Question:

有人可以帮我翻译成Laravel的查询构建器格式吗?我怀疑我必须使用DB :: raw表达式 .

我已经尝试过并且未能使用DB :: Raw表达式,这表示没有包含DB模型的错误 . 我也对开放SQL注入系统犹豫不决,无论如何都在努力解决连接问题 .

提前感谢一些迷路的人 .

1 回答

  • 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();
    

相关问题