2015-07-08 4 views
0

Я пытаюсь получить последние 3 сообщения блога из базы данных в отдельные переменные (для шаблонов). Я видел хорошую реализацию на каком-то другом сервере, и он отлично работает для следующей записи, но в третьем запросе возвращается с NULL. Как вы относитесь к этой проблеме?Eloquent next record

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(); 
    } 
} 

ответ

1

Я не могу сказать, почему ваша функция не работает, но я предлагаю вам попробуйте этот подход:

$posts = Post::orderBy('created_at', 'desc')->take(3)->get(); 
$post1 = $posts->shift(); 
$post2 = $posts->shift(); 
$post3 = $posts->shift(); 

Это приведет к выполнению только одного запроса вместо трех. Вызов shift() в коллекции затем вернет первый элемент и удалит его, чтобы второй пост был «первым» при следующем его вызове.

+0

Это весьма аккуратно. – lesssugar

+0

Спасибо, проблема решена! – Gabesz

1

В вашей функции next результат даст самое раннее сообщение, а не следующее. Поэтому третий вызов будет возвращать нулевое значение, потому что после первой записи нет сообщения. Добавив 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(); 
Смежные вопросы