2015-03-08 138 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