我正在构建一个类似Twitter的应用程序,其中包含一个feed。在此Feed中,我需要显示具有此属性的共享:
-Shares来自用户,我正在关注
- 来自用户的分数,按正面评级排序,但只有前10%
我需要以某种方式合并这两个查询,因此它最终将成为一个数组,其中包含所有适用于此条件的共享,没有任何重复项并按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);
问题在于,我被告知有更好的方法可以解决这个问题。 另外,$ shares给我的结果适用于标准,但是股票有重复(行,适用于这两个标准),并且不是由id desc排序。
如果你能告诉我,我会很高兴,如何以正确的方式做到这一点。
非常感谢!
答案 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();