laravel手动分页

时间:2018-04-25 08:42:36

标签: laravel pagination eloquent

我想为我的选择查询添加laravel paginator: 以下查询工作正常,但无法添加laravel paginator。

    $results = DB::select('SELECT
    distances.*
FROM
    (SELECT
        ( 6371 * acos( cos( radians(23.0376279 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(72.5102283 ) ) + sin( radians(23.0376279 ) ) * sin( radians( latitude ) ) ) ) AS distance,
        shopdatabase.shop_product.stock,
        shopdatabase.shop_product.price AS price,
        shopdatabase.shops.id AS shopId,
        shopdatabase.product.name AS name,
        shopdatabase.product.id AS productId,
        shopdatabase.shops.name AS shopName,
        shopdatabase.shop_product.status,
        shopdatabase.product_image.title AS image,
        shopdatabase.product_meta.metaValue AS sourceDetails,
        shopdatabase.product.sourceUrl
     FROM
        shopdatabase.shop_product
        INNER JOIN shopdatabase.shops
         ON shopdatabase.shop_product.shopId = shopdatabase.shops.id
        INNER JOIN shopdatabase.product
         ON shopdatabase.shop_product.productId = shopdatabase.product.id
        INNER JOIN shopdatabase.product_image
         ON shopdatabase.shop_product.productId = shopdatabase.product_image.productId
        INNER JOIN shopdatabase.product_meta
         ON shopdatabase.shop_product.productId = shopdatabase.product_meta.productId
     WHERE
        shopdatabase.shop_product.status = "active") distances
WHERE
    distance < 20
ORDER BY
    distance ASC');

或者你能告诉我如何用Eloquent写这个选择查询? 如果我们可以用Eloquent编写上面的代码,那将是很好的。

2 个答案:

答案 0 :(得分:0)

我建议你仔细阅读Lalovel文档中的Eloquent,并学习如何正确使用关系。

查看此资源:https://laravel.com/docs/5.6/eloquent-relationships

设置模型关系后,您应该可以调用此处指定的paginate方法:

https://laravel.com/docs/5.6/pagination

你应该能够使用这样的东西:

$foo->with('bar')->paginate();

答案 1 :(得分:0)

Eloquent通常不是更复杂查询的最佳选择。

正如早先的评论者提到的那样,你可以通过建立关系来改进这一点。

但是,您应该能够使用paginate()对查询构建器结果进行分页。

DB::select($query)->paginate(25);

另一种选择是在集合上使用slice()。

$collection = DB::select($query)->get();
$collection->slice(($currentPage-1) * $size, $size);

然后,如果您需要一个分页器来创建链接等,您可以手动创建一个分页器。

new LengthAwarePaginator(
            $collection,
            $total,
            $size,
            $currentPage
        );