Php Laravel 5.8-如何排序(按医嘱)多个关系

Php Laravel 5.8-如何排序(按医嘱)多个关系,php,laravel,laravel-5,Php,Laravel,Laravel 5,我正在尝试按视频视图对连续剧进行排序 关系: 序列号与序列号有许多关系。 这部连续剧与剧集有很多关系。 这些插曲与视频有着千丝万缕的联系。 视频与浏览量有很多关系 <?php //sort method: public function mostPopular() { $serials = Serial::with(['series.episodes.video' => function ($query) { $query->w

我正在尝试按视频视图对连续剧进行排序

关系: 序列号与序列号有许多关系。 这部连续剧与剧集有很多关系。 这些插曲与视频有着千丝万缕的联系。 视频与浏览量有很多关系

<?php
//sort method:
public function mostPopular()
    {

        $serials = Serial::with(['series.episodes.video' => function ($query) {
            $query->withCount(['videoViews' => function($query) {
            }])->orderBy('video_views_count', 'desc');
        }])->get();

        return $serials;
}

//Serial model:
public function series()
{
   return $this->hasMany(Series::class);
}


//Series model:
public function episodes()
{
   return $this->hasMany(Episode::class);
}

public function serial()
{
   return $this->belongsTo(Serial::class);
}

//Episode model:
public function video()
{
   return $this->hasOne(Video::class);
}

public function series()
{
   return $this->belongsTo(Series::class);
}

//Video model:
public function videoViews()
{
   return $this->hasMany(VideoView::class);
}

public function episode()
{
   return $this->belongsTo(Episode::class);
}


?>

我希望按视频视图排序的序列(series.scents.video.videoViews),但实际输出没有排序

拉威尔5.8 PHP7

因为“With”查询作为单独的查询运行(而不是之前建议的子查询),所以从一个查询向另一个查询公开外推的fuax列变得相当棘手。我确信API文档中有没有文档化的解决方案,但我从未遇到过。您可以尝试将with和withCount放在orderBy中:

Serial::orderBy(function($query) { some combo of with and withCount })
但这也会变得棘手。由于这两种方法都会多次命中数据库,因此您自己进行分离,同时保持理智也是同样有效的。第一个查询使用左连接、原始group by和原始select,因为我不希望laravel将with查询作为一个单独的查询运行(首先是这个问题)

$seriesWithViewCounts=VideoView::leftJoin('scents','scents.id','=','video\u views.scents\u id'))
->groupBy(DB::raw('scents.series_id'))
->选择raw(“剧集.系列\u id,将(视频\u视图.id)计数为视图”)
->get();
$series=series::findMany($seriesWithViewCounts->pull('series_id');
foreach($s系列){
$s->view\u count=$seriesWithViewCounts->first(函数($value,$key)使用($s){
返回$value->series\u id=$s->id
})->视频浏览次数;
});
$sortedSeries=$series->sortBy('video\u views\u count');
这将忽略所有剧集都没有视图的任何剧集,因此您可能希望抓取这些剧集并将其附加到结尾。不是我对“流行”的定义


我很想看到一个更有说服力的方法来处理这个问题,但这可以解决问题

这实际上是一个愚蠢的问题,但我已经了解到,在集合上使用多个->排序实际上是不需要任何解决方法的。只是你需要颠倒它们的顺序。所以,根据他们的专辑名称对艺术家目录进行排序,这将是一个解决方案

而不是:

$collection->sortBy('artist')->sortBy('title');
这样做:

$collection->sortBy('title')->sortBy('artist');

我对withCount约束上的空函数体很好奇。['videoViews'=>函数($query){}]。如果计数没有额外的逻辑,那么应该只保留关系的字符串名称:$query->withCount(['videoViews'])。这可能不是根本问题。行为是一样的。这确实是一个有趣的问题。计算通过几个hasmany多次删除的关系通过关系我以前没有见过讨论过。如果性能成为问题,您可以考虑缓存该答案。Redis喜欢有序列表,或者您可以将序列号存储在一个数组中,并每小时更新一次。或者你可以在视频视图表中存储一个索引的“series\u id”,这样你就可以跳过插曲模型,直接用一个简单的withCount点击视频视图表。它不起作用。。。“SQLSTATE[42S22]:未找到列:“order子句”(SQL:select*from
serials
order by
video\u views\u count
desc)中的1054未知列“video\u views\u count”)抱歉,忘记了laravel子查询是单独运行的。使用新方法编辑答案:-P