统计一篇文章的评论数量 - Laravel 5.2

时间:2016-07-07 15:50:58

标签: php laravel relationship

我需要计算帖子有多少评论。我该怎么做呢?

这是我的Listing.php模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Listing extends Model
{

    public function reviews()
    {
        return $this->hasMany('\App\Review');
    }

}

这是我的Review.php模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Review extends Model
{
    protected $fillable = ['stars','name','comment'];

    public function listing()
    {
        return $this->belongsTo('\App\Listing');
    }
}

这是我尝试在控制器中计算的方法

 public function mostReviews(Request $request) {

        $listings = Review::orderBy('-- most reviews here --')->take(10)->get();

        $headline = 'Most Reviewed Listings';

        return view('pages.listings', compact('listings', 'headline'));

    }

这是我的评论表:

Review table for listing

5 个答案:

答案 0 :(得分:1)

我还没有对它进行过测试,但下面的查询(使用查询构建器)应该可以提供您想要的内容 - 10条评论最多的商家信息。此外,average_stars列应返回平均星级费率。通过将orderBy更改为average_stars,您可以轻松修改查询以获得10个评分最高的商家信息。

$listings = \DB::table('reviews AS r')
   ->select([
     'r.listing_id',
     \DB::raw('COUNT(*) AS no_of_reviews'),
     \DB::raw('AVG(r.stars) AS average_stars'),
     'l.*'])
   ->join('listings AS l', 'l.id', '=', 'r.listing_id')
   ->limit(10)
   ->orderBy('no_of_reviews', 'DESC')
   ->groupBy('listing_id')
   ->get();

请注意Laravel版本5.2之前的版本,这将返回stdObject的数组。您可以通过与Eloquent Collection类似的方式轻松访问刀片模板中的那些。

@foreach($listings as $listing)
<tr>
   <td>{{ $listing->id }}</td>
   <td>{{ $listing->title }}</td>
   <td>{{ $listing->no_of_reviews }}</td>
   <td>{{ floor($listing->average_stars) }}</td>
</tr>
@endforeach

答案 1 :(得分:1)

这就是我所做的:

public function mostReviews() {

  $reviews = DB::table('reviews')
      ->select(DB::raw('AVG(stars) as review_score, listing_id'))
      ->groupBy('listing_id')
      ->orderBy('review_score', 'desc')
      ->limit(10)
      ->get();

  foreach($reviews as $key => $review) {
    $reviews[$key] = Listing::find($review->listing_id);
  }

  return view('listings.most-reviews', [
    'listings' => $reviews
  ]);

}

答案 2 :(得分:0)

以下内容应该有效

$listing = Listing::with('reviews')->orderByRaw(function($listing)
{
    return $listing->review->count();
}, desc)->take(10)->get();

答案 3 :(得分:0)

试试这个

$review = Review::orderBy('-- most reviews here --');
$reviewCount = $review->count();
$listings=$review->take(10)->get();

答案 4 :(得分:0)

您的商家信息模型中的

  public function countReview() { 
  return count($this->reviews); 
  } 

在您的观点中:

 {{$listing->countReview()}} 

也许在控制器中你可以写出类似的东西:

 public function mostReviews() { 
  Review::orderBy('listing', 'desc')->blahblah; // or 'asc'
 }