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。即使没有查询生成器,也需要一些操作。看一看这篇文章,更好地理解为什么会是这样,但用户和评论都是这样。即时加载不会限制从数据库中检索帖子,所以就性能而言,这并不是一个真正的改进,因为您将获得所有类别,每个类别都有所有帖子。