雄辩的下一个记录

时间:2015-07-08 19:38:21

标签: php laravel eloquent

我试图将数据库中的最后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();
    }
}

2 个答案:

答案 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();