Laravel - Как суммировать относительную таблицу с лимитным результатом? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть эти 2 модели.

Я хочу получить сумму из 12 столбцов comment_count в youtube_video_insights таблице.

Как это сделать с помощью Query Builder или Eloquent.

Я пытаюсь использовать что-то вроде этого в моем репозитории, но это не сработало.

Это просто сумма всех comment_count столбцов.

$this->youtube_channel_insight
            ->join('youtube_video_insights',function ($q){
                $q->on('youtube_channel_insights.id','=','youtube_video_insights.youtube_channel_insight_id')
                    ->orderBy('youtube_video_insights.id','desc')
                    ->limit(12);
            })
            ->where('youtube_channel_insights.id',$id)
            ->select(\DB::raw(
                "SUM(youtube_video_insights.comment_count) as total_comment"
            ))->get();
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class YoutubeChannelInsight extends Model
{
    protected $guarded = ['id'];

    public function videos()
    {
        return $this->hasMany(YoutubeVideoInsight::class);
    }
}

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class YoutubeVideoInsight extends Model
{
    protected $guarded = ['id'];
}

1 Ответ

0 голосов
/ 20 февраля 2020

Я предполагаю, что структура ваших таблиц:

для таблицы youtube_channel_insights у вас есть:

id | name
----------------------------------------
1  | channel_01
2  | channel_02

и для youtube_video_insights у вас есть таблица:

id | channel_id|    name    | comment_count
----------------------------------------
1  |     1     |  video_01  |      20
2  |     1     |  video_02  |      40
3  |     2     |  video_03  |      5
4  |     2     |  video_04  |      15

Теперь вы должны написать свой запрос следующим образом:

$sub1 = YoutubeVideoInsight ::select('comment_count', 'channel_id')
->whereRaw('channel_id = 2')->orderBy('id', 'Desc')->limit(2);

$sub2 = DB::table(DB::raw("({$sub1->toSql()}) as sub"))
->select(DB::raw('
SUM(`comment_count`) AS total_comment,
channel_id
'));


return $query = YoutubeChannelInsight ::joinSub($sub2,'sub2',function($join){
$join->on('channels.id','=','sub2.channel_id');
})->get();
...