我试图将数据库中的最后3篇博文发布到单个变量(对于模板)。我在其他一些thred中看到了一个很好的实现,它适用于下一条记录,但在第三个查询返回NULL。你对这个问题有什么看法?
BlogController.php:
public function getIndex($l = 'hu')
{
$post_last = Post::orderBy('created_at', 'desc')->first();
$post_2 = $post_last->next($post_last->created_at);
$post_3 = $post_2->next($post_2->created_at);
var_dump($post_3);
}
post.php中:(型号)
<?php
namespace Civitas;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* Physical table name
*/
protected $table = 'posts';
/**
* Get next result in record list
*
* @param $created_at
* @return mixed
*/
public function next($c) {
return Post::where('created_at', '<', $c)->get()->first();
}
}
答案 0 :(得分:1)
我不知道为什么你的功能不起作用,但我建议你尝试这种方法:
$posts = Post::orderBy('created_at', 'desc')->take(3)->get();
$post1 = $posts->shift();
$post2 = $posts->shift();
$post3 = $posts->shift();
这只会运行一个查询而不是三个查询。在集合上调用shift()
将返回第一个项目并将其删除,以便下次调用时第二个帖子将是“第一个”。
答案 1 :(得分:1)
在next
函数中,结果将提供最早的帖子,而不是下一个帖子。因此,第三次调用将返回null,因为在最早的之后没有帖子。为orderBy
字段添加created_at
,它将按预期工作。
public function next(){
return static::where('created_at', '<' , $this->created_at)
->orderBy('created_at','desc')
->first();
}
然后在您的控制器中,您可以这样调用:
$post_last = Post::orderBy('created_at', 'desc')->first();
$post2 = $post_last->next();
$post3 = post_last->next()->next();