2013-08-23 246 views
1

我正在構建一個類似Twitter的應用程序,其中包含一個Feed。在這種飼料,我需要這個屬性來顯示股:Laravel - 合併兩個查詢?

從用戶

-Shares,我是誰的用戶,這是由正面的評級分類如下

-Shares,但只有TOP10%

這兩個查詢我需要以某種方式合併,所以它將成爲一個數組在最後,它具有適用於此標準的所有股份,沒有任何重複和按ID排序,desc

我的表看起來像這個:

User, Shares, Follows 

Shares: 
-user_id 
-positive 

Follows: 
-follower_id 
-user_id 
-level 

我已經嘗試過:

$follower_shares = Share::join('follows', 'shares.user_id', '=', 'follows.user_id') 
     ->where('follows.follower_id', Auth::user()->id) 
     ->where('follows.level', 1) 
     ->get(array('shares.*')); 


//count = 10% of total shares 
$count = Share::count()/10; 
$count = round($count); 


$top10_shares = Share::orderBy('positive', 'DESC') 
->take($count) 
->get(); 


//sorts by id - descending 
$top10_shares = $top10_shares->sortBy(function($top) 
{ 
    return -($top->id); 
}); 


//merges shares 
$shares = $top10_shares->merge($follower_shares); 

的問題是現在,我被告知,沒有解決這個更好的方法。 此外,$股給我的結果適用於標準,但股票有重複(行,這是適用於這兩個標準),並沒有按id desc總共排序。

我會很高興,如果你能告訴我,如何以正確的方式做到這一點。

非常感謝!

+0

廣東話,只是你一個不同的檢查某處那裏沒有得到重複?或者在陣列上運行一個array_unique後.....也許我完全誤解你,但如果是這樣......只是不理我:) – KyleK

+0

array_unique是值得一試:)謝謝 –

+0

哦實際上$股是一個對象... –

回答

3

我發現這是一個非常乾淨的解決方案:

// Instead of getting the count, we get the lowest rating we want to gather 
$lowestRating = Share::orderBy('positive', 'DESC') 
        ->skip(floor(Share::count() * 0.1)) 
        ->take(1)->lists('positive'); 

// Also get all followed ids 
$desiredFollow = Auth::user()->follows()->lists('user_id'); 

// Select where followed or rating higher than minimal 
// This lets the database take care of making them distinct 
$shares = Share::whereIn('user_id', $desiredFollow) 
       ->orWhere('positive', '>=', $lowestRating[0]) 
       ->get(); 
+0

哇,這是我搜索的。它的方式比我的清潔,而且非常完美。謝謝Raphael_ :) –

+0

如何將兩個結果與(「圖像」) - >與(「對象」)合併爲一個結果? – Dev