【问题标题】:How to make Laravel 4 pagination如何使 Laravel 4 分页
【发布时间】:2025-11-28 14:30:01
【问题描述】:

大家好,我正在尝试在 Laravel 4 中进行分页,但我的代码不起作用。 我有带动作的控制器:

public function getSingleProduct($prodName, $id)
    {               
        $singleProduct = Product::getOne($id);
        $getAllReviews = Review::getAllBelongsToProduct($id);
        $this->layout->content = View::make('products.single')
                                     ->with('reviews', $getAllReviews)
                                     ->with('products', $singleProduct);
    }

我想对 getAllReviews 进行分页(每页 5 个)。我试过这样: $getAllReviews = Review::getAllBelongsToProduct($id)->paginate(5); 但它对我不起作用。这也是我的评论模型

public static function getAllBelongsToProduct($id) {
     return self::where('product_id', '=', $id)
                ->join('products', 'reviews.product_id', '=', 'products.id')                    
                ->select('reviews.*', 'products.photo')
                ->orderBy('created_at', 'desc')
                ->get();
}

我哪里有错误?

【问题讨论】:

  • paginateget 不能一起使用。
  • 那么,我怎样才能获得属于一个产品的所有评论并将这些评论分页?有什么解决办法吗?
  • 不要使用这种静态方法。你为什么要使用它?我建议为此设置范围,因为它最终不是静态的 - 无论如何它都会实例化您的 Review 模型。我将在几秒钟内向您展示如何使用范围
  • 好的,谢谢,我已经开始使用 laravel 进行冒险了,所以我不是这方面的大师;p

标签: php laravel laravel-4 pagination


【解决方案1】:

您的模型使用查询范围而不是静态方法,这将是灵活的:

// Review model
public function scopeForProduct($query, $id)
{
    $query->where('product_id', $id);
}

public function scopeWithProductPhoto($query)
{
    $query->join('products', 'reviews.product_id', '=', 'products.id')                    
      ->select('reviews.*', 'products.photo');
}

然后使用它:

// get all
$reviews = Review::forProduct($id)->withProductPhoto()->latest()->get();

// get paginated
$reviews = Review::forProduct($id)->withProductPhoto()->latest()->paginate(5);

latestorderBy('created_at', 'desc') 的内置方法。

如果您只想在控制器中进行一次调用,则将上面的内容链接起来并将其包装在模型上的方法中。

【讨论】:

  • 非常感谢,所以我应该始终使用查询范围而不是静态方法吗?
  • 这并不是说你应该总是使用查询范围,并且永远不要使用静态方法。但是,我向您展示的方式要灵活得多。而且您需要知道,对 Eloquent 模型的每个静态(或静态外观 ::)调用都会实例化它。
  • 我能再问你一个问题吗?如何获取每个产品的最新评论并将其显示在所有产品的页面中?
  • 使用hasOne 关系并急切地为每个产品加载单个评论,就像在这种情况下:*.com/questions/24343738/…
  • 对我来说,当我在产品模型public function latestPrice() { return $this->hasOne('Review')->latest(); } 中这样做时,它对我不起作用。我需要类别页面中每个产品的最新评论。我应该问新问题吗?