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 byvideo\u views\u count
desc)中的1054未知列“video\u views\u count”)抱歉,忘记了laravel子查询是单独运行的。使用新方法编辑答案:-P