从孩子中提取最后3条记录,Php/Laravel

k4aesqcs  于 2023-01-27  发布在  PHP
关注(0)|答案(2)|浏览(101)

请帮帮我。
我试图写一个函数,我得到我的论坛与3个最近更新的主题在给定类别的所有类别。
但根据结果,采取(3)过滤器由id(其中id不高于3),我需要得到最后3个记录。

public function index()
{
    $forums = Category::with(['posts' => function ($q){
    return $q->take(3)->get();
}])->get();
dd($forums);
}
8cdiaqws

8cdiaqws1#

你应该按照update_at降序排列你的完整查询,只有在你可以得到前3个之后。

$q->orderBy('update_at', 'desc')->take(3)->get();

您的Categories表似乎与posts表不同,因此当创建或更新帖子时,您还应该将其类别的update_at设置为now。

0ve6wy6x

0ve6wy6x2#

据我所知你不能把take()或limit()用在()里面;
编辑:由Sardov先生选择的解决方案是使用staudenmeir/elaborent-eager-limit软件包。在此答案下方提供了链接。
所以对于你需要做的就是通过限制它来脱离模型关系。
例如:

class Category extends Model {

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

public function limitPosts()
{
    return $this->hasMany('App\Models\Post')
      ->limit(3);
}

public function limitLatestPosts()
{
    return $this->hasMany('App\Models\Post')
      ->orderBy('created_at', 'desc'). // or use ->latest()
      ->limit(3);
}

}

它是这样使用的:

Category::query()
->with(['limitPosts' => function($query) { 
   $query->orderBy('created_at', 'desc'); // the last records
}])
->where('id', '<=', 3) // id not higher than 3
->get();

或者

Category::query()
->with('limitLatestPosts')
->where('id', '<=', 3) // id not higher than 3
->get();

希望这能帮到你。

相关问题