2015-03-08 70 views
0

我有一个MySQL查询,我想用Laravel 5的查询生成器格式实现。Laravel 5.0查询使用查询生成器加入

我有表Items和FaceOff。在我的Laravel控制器中,我引用了名称空间/ Items和名称空间/ 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') 

我可以别名的列名,但不知道如何别名整个查询的结果。

总之,我试图抓住2个在“头对头”面前没有遇到的随机物品。把它想象成两个竞争者的搭档 - 每个竞争者只应该支付一个竞争对手一次。所以,查询应该返回ID1和ID2。那些应该是不同的ID,并且不是相互竞争的。

问:

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

我试过了,并且未能使用DB :: Raw表达式,它给出了一个关于不包含数据库模型的错误。我也对开放SQL注入系统犹豫不决,无论如何,努力解决连接问题。

非常感谢您的帮助。

回答

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(); 
+0

什么在哪里..和在同一张表 – 2016-03-31 02:04:30