Laravel Eloquent имеет много связей с группировкой и сортировкой - PullRequest
0 голосов
/ 04 июня 2018

Я использую Laravel 5.6 и хотел бы получить сборник популярных статей, опубликованных за последние 2 недели, отсортированный по количеству просмотров за последнюю неделю.Идеально использовать нумерацию страниц для модели.

DB:

author (id, name, ....)
article (id, title, content, publish_date, ...)
article_view (id, article_id, date, views)
featured_article (id, article_id, created_at)

Модели

class Author extends Model
{
    protected $table = 'author';
    public function articles()
    {
        return $this->hasMany(Article::class,'id','author_id');
    }
}

class Article extends Model
{
   protected $table = 'article';
   public function author()
   {
        return $this->hasOne(Author::class,'id','author_id');
   }
}

class FeaturedArticle extends Model
{ 
   protected $table = 'featured_article';
   static public function getFeaturedArticles($limit)
   {
     $articles = FeaturedArticles::where('created_at', '>=', Carbon::now()->subDays(14))->with(['article.author','article.articleViews'])->paginate($limit);
   }
}

Затем в контроллере или функции или задании

$featured_articles = FeaturedArticle::getFeaturedArticles(15);

Это отлично работает, но результаты еще не отсортированы.Как отсортировать разбитые на страницы результаты по сумме article_view.views за 7 дней.Возможно ли это?

1 Ответ

0 голосов
/ 05 июня 2018

Предположим, вы хотите сначала самую просматриваемую статью:

class FeaturedArticle extends Model
{
    public function articleViews() {
        return $this->hasMany(ArticleView::class, 'article_id', 'article_id');
    }
}

$articles = FeaturedArticle::where('created_at', '>=', Carbon::today()->subDays(14))
    ->withCount(['articleViews' => function($query) {
        $query->select(DB::raw('sum(views)'))
            ->where('date', '>=', Carbon::today()->subDays(7));
    }])
    ->orderByDesc('article_views_count')
    ->with('article.author', 'article.articleViews')
    ->paginate($limit);

Я заменил Carbon::now() на Carbon::today().В противном случае вы не получите статьи, которые были опубликованы 14 дней назад до времени now().

Кроме того, ваши отношения неверны:

public function articles()
{
    return $this->hasMany(Article::class, 'author_id', 'id');
}

public function author()
{
    return $this->belongsTo(Author::class, 'author_id', 'id');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...