簡體   English   中英

如何通過Laravel Eloquent執行這個復雜的查詢?

[英]How to execute this complex query through Laravel Eloquent?

我在SQL中有這個復雜的查詢:

SELECT distinct(albumId) as id,
band,albumName as name,
SUM(numberOfPlays) as numberOfPlays
FROM (
SELECT COUNT(*) as numberOfPlays,
tracks.album_id as albumId,
a.name as albumName,b.name as band
FROM logs l
LEFT JOIN tracks ON tracks.id=l.track_id
LEFT JOIN albums a ON tracks.album_id = a.id
LEFT JOIN bands b ON b.id = tracks.band_id
WHERE l.time>$days
GROUP by trackid
ORDER BY numberOfPlays DESC LIMIT 0,100) t
GROUP BY albumId ORDER BY numberOfPlays DESC");

到目前為止,我已經成功使用以下方法檢索了內部查詢:

Logs::select(DB::raw(
                    'COUNT(*) as numberOfPlays'
                ), 'track_id')
               ->where('time', '>', $days)
               ->orderBy('numberOfPlays', 'DESC')->take(100)
               ->with('track', 'track.album')
               ->groupBy(\DB::raw("track_id"))->orderBy('numberOfPlays', 'DESC');

如何對上述查詢返回的數據進行進一步的查詢?

實際上,您可以通過Eloquent ORM並利用返回的Collection結果上可用的方法來獲得相似的結果。 這是一個例子。 考慮到您擁有所有模型類。

$logs = Log::with(['track.album', 'track.band'])->where('time', '>', $days)->take(100)get();




class Log extends Eloquent {

   public function track() {
      return $this->belongsTo('Track');
   }
}


Class Track extends Eloquent {

   public function album() {
     return $this->belongsTo('Album');
   }

   public function band() {
     return $this->belongsTo('Band');
   }

}

Class Album extends Eloquent {

}


Class Band extends Eloquent {}

現在以您想要的方式產生結果,您可以使用返回的集合將其項轉換為可表示的結構。

首先,我們將日志按專輯分組

$logsByAlbum = $logs->groupBy('track.album.id');

然后轉換分組的日志

$logsByAlbum->transform(function($album_logs) {

    if(!empty($album_logs)) {

      return array(
        'id' => $album_logs[0]->album->id,
        'album_name' => $album_logs[0]->album->name,
        'numberOfPlays' => count($album_logs)
      );

    }

    return array();

});

After transformation, we need to filter the items with empty values
$final_result = $logsByAlbum->filter(function($item) { 
      return !empty($item);
});

return $final_result->toArray();

這只是一個基本概念,可以幫助您使用Eloquent ORM和collection類中提供的方法的功能。

請享用! :d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM