2015-07-09 2 views
0

Я использую laravel 5.1 для разработки CMS. У меня простая структура сообщений, пользователям и пользователям могут нравиться сообщения.Laravel 5.1 - Trending Posts - Запрос на количество отношений с временной отметкой состояния pivot

Я хочу перечислить трендовые сообщения (сообщения с наибольшим количеством просмотров за последние 1 неделю в порядке desc). Сообщения и пользователи имеют отношение «многие-ко многим» и используют сводную таблицу для отношений.

Сообщение Модель имеет

public function likedby() 
{ 
    return $this->belongsToMany('App\Models\User','user_like_post') 
     ->withTimestamps(); 
} 

пользователя Модель имеет

public function likes(){ 
    return $this->belongsToMany('App\Models\Post','user_like_post') 
     ->withTimestamps(); 
} 

Как я могу написать красноречивый запрос, поэтому я получать простирание поста. Мне нужно использовать временную метку сводной таблицы, которую мне трудно использовать.

Это то, что я пробовал, но он использовал 'created_at' таблицы столбиков, а не сводной таблицы.

$trending = Post::with('likedby')->get() 
    ->sortByDesc(function ($post){ 
     $one_week_ago = Carbon::now()->subWeeks(1); 
     return $post->likedby 
      ->where('created_at','>=',$one_week_ago) 
      ->count(); 
    } 
); 

ответ

1

Вы можете ограничить нетерпеливые нагрузки в пределах метода with, однако это все равно загрузит все сообщения, но только хотят нагрузки на likedby отношение, когда он меньше, чем одна недели. Это, вероятно, не то поведение, которое вы хотите, но стоит упомянуть.

Post::with(['likedby' => function($query) { 

    $query->where('created_at', '>=', Carbon::now()->subWeeks(1)); 

}])->get(); 

Для сообщения только нагрузки, которые были любил в течение последней недели, вы бы лучше всего методом whereHas. Это предоставит вам список сообщений, которые были помещены на них в течение последней недели.

Post::whereHas('likedby', function ($query) { 

    $query->where('created_at', '>=', Carbon::now()->subWeeks(1)); 

})->get(); 
+0

Я думаю, что я нужен первый один, но он дает мне ошибку - «Целостность нарушение ограничения: 1052 Колонка„created_at“в, где положение является неоднозначным» - это не в состоянии понять, какие «created_at» это должно быть с помощью. – Aakash

+0

Странно, что закрытие использует только запрос отношения. Вы делаете что-нибудь еще в основном запросе 'Post', который может это сделать? –

+1

Я решил это, поставив 'user_like_post.created_at' в where where, чтобы указать, какой create_at будет использоваться. Благодарю. – Aakash

Смежные вопросы