Eloquent获取与日期相关的大多数关系的行

时间:2015-07-05 11:36:34

标签: php laravel laravel-5 eloquent

我正在与Laravel合作,我目前的任务是获得上周播放的十首歌曲。

$mostPlayed = Track::join('track_tracklist as pl', 'pl.track_id', '=', 'tracks.id')
            ->groupBy('tracks.id')
            ->orderBy('count','desc')
            ->take(10)
            ->get(['tracks.*', DB::raw('COUNT(pl.track_id) as count')]);

此查询工作正常,它返回了我播放的10首歌曲,但没有日期限制。因此,我需要将连接的跟踪列表限制为给定日期(应与跟踪列表中存储的日期进行比较),但我不知道如何添加它。

谢谢:)

更新

我找到了一个可能的解决方案,但效率不高。上面的代码需要 0.009023904800415秒,代码低于0.96272301673889,需要100%的时间。当然上面的代码更快,因为它没有比较日期,但应该有更好的方法来解决问题。

    $time = '2015-05-01';
    $elements = [];
    $maxArray = [
        'element' => null,
        'count' => 0
    ];
    for ($i = 0; $i < 10; $i++) {
        $elements[] = $maxArray;
    }
    foreach (Track::all() as $track) {
        $tracklists = $track->tracklists()->where('time', '>=', $time)->get();
        for ($i = 0; $i < count($elements); $i++) {
            if (count($tracklists) > $elements[$i]['count']) {
                array_splice($elements, $i, 0, [[
                    'element' => $track,
                    'count' => count($tracklists)
                ]]);
                array_pop($elements);
                break;
            }
        }
    }

  jedrzej.kurylo接近解决方案,只是忘记了第一次加入呼叫的一个参数:

        $time = '2015-07-02';
        $mostPlayed = Track::join('track_tracklist', 'track_tracklist.track_id', '=', 'tracks.id')
            ->join('tracklists', function ($join) use ($time) {
                $join->on('tracklists.id', '=', 'track_tracklist.tracklist_id')->where('tracklists.time', '>=', $time);
            })
            ->groupBy('tracks.id')
            ->orderBy('count', 'desc')
            ->take(10)
            ->get(['tracks.*', DB::raw('COUNT(track_tracklist.track_id) as count')]);

将返回今天和给定日期之间播放的前10首曲目,需要0.01秒而不是1秒,每次循环使用a。

1 个答案:

答案 0 :(得分:1)

如果您只想计算给定日期范围内的track_tracklist记录,则需要在JOIN上应用其他约束:

$time = '2015-05-01';
$mostPlayed = Track::join('track_tracklist as pl','pl.track_id', '=', 'tracks.id')
->join('tracklists', function($join) use ($time) {
  $join->on('pl.tracklist_id', '=', 'tracklists.id');
  $join->where('tracklists.time', '>=', $time)
})
->groupBy('tracks.id')
->orderBy('count','desc')
->take(10)
->get(['tracks.*', DB::raw('COUNT(pl.track_id) as count')]);