2014-02-20 2 views
10

Я пытаюсь создать страницу, где я могу видеть всех людей в моей базе данных и создавать на них изменения. Я сделал форму, где я заполняю данные из базы данных определенных полей.Laravel предыдущие и следующие записи

Я хотел бы перейти через них через кнопку Next и Previous.

Для создания следующего шага я должен взять идентификатор больше текущего, чтобы загрузить следующий профиль.

Для создания предыдущего шага мне нужно, чтобы идентификатор был меньше текущего, чтобы загрузить предыдущий профиль.

Мой маршрут:

Route::get('users/{id}','[email protected]'); 

Контроллер:

public function show($id) 
    { 

     $input = User::find($id); 

     // If a user clicks next this one should be executed. 
     $input = User::where('id', '>', $id)->firstOrFail(); 



     echo '<pre>'; 

     dd($input); 

     echo '</pre>'; 

     return View::make('hello')->with('input', $input); 
    } 

Вид: Кнопки:

<a href="{{ URL::to('users/' . $input->id) }}">Next</a> 

Что такое лучший способ получить текущий ID а также увеличить его?

+0

К сожалению, я не могу ответить на этот вопрос (хотя, вероятно, я бы тоже использовал ваш подход, а затем задался вопросом, есть ли лучший способ, как вы), но я думаю, что 'firstOrFail' может оказаться проблемой: когда пользователь добирается до просмотрите последнюю модель, а t han может видеть, что они получают страницу 404, просто потому, что нет «следующей» модели. – alexrussell

ответ

42

Ниже ваши обновленный контроллер и просматривать файлы, производных от @ ridecar2 ссылки,

Контроллер:

public function show($id) 
{ 

    // get the current user 
    $user = User::find($id); 

    // get previous user id 
    $previous = User::where('id', '<', $user->id)->max('id'); 

    // get next user id 
    $next = User::where('id', '>', $user->id)->min('id'); 

    return View::make('users.show')->with('previous', $previous)->with('next', $next); 
} 

Вид:

<a href="{{ URL::to('users/' . $previous) }}">Previous</a> 
<a href="{{ URL::to('users/' . $next) }}">Next</a> 
+0

Я сделал новую версию, основанную на вашей версии, спасибо! У меня все еще есть некоторые проблемы, которые я сделал в этом фрагменте: http://laravel.io/bin/WWxL – Duikboot

+1

@Duikboot: вы передаете переменную '$ input' в представление, а не' $ previous' или '$ next' переменные и в 'User :: find()', ** find ** должно быть в нижнем регистре. Перекрестируйте код [здесь] (http://laravel.io/bin/rrq9). –

+0

Чистый и простой. Благодаря! – danboh

0

Вот ссылка я обнаружил, что должно помочь: http://maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/

Похоже на следующий вы хотите использовать: $next = User::where('id', '>', $id)->min('id'); и имеют вид, как: <a href="{{ URL::to('users/' . $next->id) }}">Next</a>

Также не забудьте передать $next к Посмотреть.

0

простого подход

// User.php 
public static function findNext($id) 
{ 
    return static::where('id', '>', $id)->first(); 
} 

// UserController.php 
$nextUser = User::findNext($id); 

// view 
<a href="{{ URL::to('users/' . $nextUser->id) }}">Next</a> 

Ленивого подход:

// view 
<a href="{{ URL::to('users/' . $input->id . '/next') }}">Next</a> 

// routes.php (should be optimized, this is just to show the idea) 
Route::get('users/{user}/next', function($id) { 
    $nextUser = User::findNext($id); 
    return Redirect::to('user/' . $id); 
}); 
15
// in your model file 
public function next(){ 
    // get next user 
    return User::where('id', '>', $this->id)->orderBy('id','asc')->first(); 

} 
public function previous(){ 
    // get previous user 
    return User::where('id', '<', $this->id)->orderBy('id','desc')->first(); 

} 
// in your controller file 
$user = User::find(5); 
// a clean object that can be used anywhere 
$user->next(); 
$user->previous(); 
+1

Почему вы используете '-> get()', когда у вас уже есть '-> first()'? – sulaiman

+0

Это была ошибка, позвольте мне изменить это, спасибо –

+0

ваша следующая функция на самом деле предыдущая, и ваша предыдущая функция на самом деле следующая;) – rafamds

0

я разработал код.

он работает все время, даже если у нас нет какой-либо следующей или предыдущей записи

public function nextPost($table, $id) 
{ 
    $next = DB::table($table)->where('id', '>', $id)->orderBy('id','asc')->first(); 
    if(!$next) 
     $next = DB::table($table)->orderBy('id','asc')->first(); 

    return $next; 
} 

public function prevPost($table, $id) 
{ 
    $prev = DB::table($table)->where('id', '<', $id)->orderBy('id','desc')->first(); 
    if(!$prev) 
     $prev = DB::table($table)->orderBy('id','desc')->first(); 
    return $prev; 
} 
0

Я понимаю, подход принимается здесь user2581096, но я не уверен, что это является эффективным (по любым стандартам) , Мы вызываем базу данных 3 раза по-настоящему без уважительной причины. Я предлагаю альтернативу, которая будет более эффективной и масштабируемой.

Не пропускайте предыдущий и следующий идентификаторы к виду. Это устраняет 2 ненужных обращения к базе данных.

Создать следующие маршруты:

пользователей/{ID}/следующий

пользователей/{идентификатор}/предыдущий

Эти маршруты должны быть использованы в HREF атрибутов тегов анкерных

Добавьте методы в контроллер для обработки каждого из созданных вами новых маршрутов. Например:

public function getPrevious(){ 
     // get previous user 
     $user = User::where('id', '<', $this->id)->orderBy('id','desc')->first(); 
     return $this->show($user->id); 
    } 

Эта функция будет вызываться только при нажатии кнопки. Поэтому вызов базы данных выполняется только тогда, когда вам нужно действительно искать пользователя.

+0

это хороший совет, но что, если вы хотите показать предыдущие и следующие записи в представлении текущего идентификатора? ur текущий подход, если нам нужно prev & next как простой pagination btns – ctf0

0

в-случае, если вы хотите, чтобы извлечь Предыдущий/Следующий записи вместе с данными, вы можете попробовать

$id = 7; // for example 

$prev = DB::table('posts')->where('id', '<', $id)->orderBy('id','desc')->limit(1); 
$next = DB::table('posts')->where('id', '>', $id)->limit(1); 

$res = DB::table('posts') 
     ->where('id', '=', $id) 
     ->unionAll($prev) 
     ->unionAll($next) 
     ->get(); 

// now $res is an array of 3 objects 
// main, prev, next 
dd($res); 

1- строитель запрос, как правило, гораздо быстрее, чем красноречивым.

2- с союзом мы сейчас только отбивание дб один раз вместо 3.

1

я понял, более простое решение, чтобы получить предыдущий и следующий пользователь:

public function show($id) 
 
{ 
 
    $previousUser = User::where('id', '<', $id)->first(); 
 
    $nextUser = User::where('id', '>', $id)->first(); 
 
    
 
    return View::make('users.show')->with('previous', $previousUser)->with('next', $nextUser); 
 
}

Смежные вопросы