Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Eloquent中使用基于ORDER BY子句的限制查询_Php_Postgresql_Laravel_Eloquent_Laravel 5 - Fatal编程技术网

Php 如何在Eloquent中使用基于ORDER BY子句的限制查询

Php 如何在Eloquent中使用基于ORDER BY子句的限制查询,php,postgresql,laravel,eloquent,laravel-5,Php,Postgresql,Laravel,Eloquent,Laravel 5,我有两个表和相应的模型,如下所示: posts ( id auto_increment, category_id refrences_id_on_categories, data json date timestamp ) $sql = "SELECT * FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY

我有两个表和相应的模型,如下所示:

posts (
    id            auto_increment,
    category_id   refrences_id_on_categories,
    data          json
    date          timestamp
)
$sql = "SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date DESC) AS r,
    t.*
  FROM
    posts t) x full outer join categories t2
  on x.category_id = t2.id
WHERE
  x.r <= 5";

DB::select($sql);

我可以通过以下方式获得5个帖子:

Post::orderBy('category_id', 'asc')->take(5)->get();
但是,是否有任何方法可以使用雄辩的Laravel 5,dbms:postgres获得每个类别的5篇文章

编辑我正在寻找一种单行解决方案,例如使用GROUP BY或其他子句。

如果您在类别和帖子模型之间设置了关系,您可以使用该关系以这种方式为每个类别获得5篇帖子:

$categories = Category::all();

foreach ($categories as $category)
{
    $posts = $category->posts()->take(5)->get();
}
类别模型中的关系如下所示:

class Category extends Model {

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

}
您可以使用来减少查询:

$categories = Category::with('posts')->get();

foreach ($categories as $category)
{
    $posts = $category->posts()->take(5)->get();
}
基于,我使用DB::select使用原始查询,如下所示:

posts (
    id            auto_increment,
    category_id   refrences_id_on_categories,
    data          json
    date          timestamp
)
$sql = "SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date DESC) AS r,
    t.*
  FROM
    posts t) x full outer join categories t2
  on x.category_id = t2.id
WHERE
  x.r <= 5";

DB::select($sql);

谢谢,但我正在寻找使用GROUP BY或其他方法的单行解决方案。使用GROUP BY将为分组列返回一行,因此您将无法获得所需的结果,我猜这是每个类别的嵌套结果数组。你能解释一下你为什么热衷于这样做吗?也许你能解释一下,你认为如果没有雄辩的话,你是如何做到这一点的。记住,不是所有的问题解决方案都是一句话,如果感觉更优雅的话,那么雄辩也有它的局限性。假设我有很多类别,因此,在一个查询中获得结果将比在许多查询中获得结果更好。我理解您的性能考虑,但您想要的不是在一个查询中使用Elount。即使没有查询生成器,也需要一些操作。看一看这篇文章,更好地理解为什么会是这样,但用户和评论都是这样。即时加载不会限制从数据库中检索帖子,所以就性能而言,这并不是一个真正的改进,因为您将获得所有类别,每个类别都有所有帖子。