2014-01-24 5 views
0

Я искал все решения для успешной реализации пагинации, но ничего не нашел. Я новичок в Laravel, поэтому у меня может быть только одно из этих основных недоразумений.Laravel 4 Pagination not working (ErrorException)

Я создал его, как описано в текущей документации. И я получаю первую страницу успешно, именно содержание мне нужно, но когда я пытаюсь использовать нумерацию страниц, нажав на кнопку «следующий» -arrow, я получаю сообщение об ошибке:

ErrorException 
Undefined variable: reviews (View: D:\Xampp\htdocs\laravel\app\views\search.blade.php) 

Я знаю, что это в целом означает, но абсолютно не знаю, как это решить.

Это форма в файле вида:

{{ Form::open(array('url' => '/search', 'class' => 'search', 'method' =>'GET')) }} 
{{ Form::text('title') }} 
{{ Form::submit('Suche')}} 
{{ Form::close() }} 

Вот моя конфигурация маршрутов:

Route::any('/search', array('uses' => '[email protected]')); 

Вот моя функция в HomeController:

public function search() { 
    $input = Input::get('title'); 
    if($input && $input != ''){ 
     $games = DB::table('games')->where('name', 'LIKE', "%$input%")->get(); 
     foreach ($games as $game) { 
      $reviews = DB::table('reviews')->whereGame_id($game->id)->paginate(3); 
     } 
    } 
    return View::make('search', compact('reviews', 'input', 'games')); 
} 

Вот view-code вида search.blade.php, который отображает результаты:

@section('content') 
<h2>Suchergebnisse</h2> 
    @foreach ($reviews as $review) 
     @foreach ($games as $game) 
      @if ($game->id == $review->game_id) 
       <h3> {{ $game->name }} </h3> 
      @endif 
     @endforeach 
     <p>{{ (preg_replace('/\n/i', '<br/>', $review->body)) }}</p> 
    @endforeach 
{{ $reviews->appends(array('term' => $input))->links() }} 
@stop 

Я благодарю вас заранее, если кто-то знает, почему у Laravel проблемы с этим решением.

Edit: Я изменил компакт-заявление и заменить его с простым массивом, так же, как что:

return View::make('search', array('reviews' => $reviews, 'input' => $input, 'games' => $games)); 

Затем я добавил global $games; global $reviews; к контроллеру, так что ошибки " Неопределенная переменная: отзывы «исчезли. Теперь я получил следующее сообщение, но только на странице 2, стр 1 работает отлично:

ErrorException 

Invalid argument supplied for foreach() (View: D:\Xampp\htdocs\laravel\app\views\search.blade.php) 
+0

Есть ли какой-либо причине вы используете 'compact', а просто создать массив? – ollieread

+0

Я только что заменил «compact» на нормальный массив, поэтому у меня есть: 'return View :: make ('search', array ('reviews' => $ review, 'input' => $ input, 'games '=> $ games)); 'Затем я добавил' global $ games; глобальные обзоры $; 'контроллеру. Теперь ошибка изменяется, теперь она говорит: 'ErrorException: Недопустимый аргумент, предоставленный foreach() (View: D: \ Xampp \ htdocs \ laravel \ app \ views \ search.blade.php)' ' – hardking

ответ

0

Прежде всего, вы делаете это

foreach ($games as $game) { 
    // $reviews is being updated every time in loop 
    $reviews = DB::table('reviews')->whereGame_id($game->id)->paginate(3); 
} 

Таким образом, каждый раз, когда есть новое значение в настоящее время устанавливается в $review, но он должен быть массивом, и именно поэтому вы должны объявить пустой массив перед циклом, как этот

$reviews = []; // or array(); 
foreach ($games as $game) { 
    $reviews[] = DB::table('reviews')->whereGame_id($game->id)->paginate(3); 
} 

Итак, вы получите массив в $review переменная.

Что касается сообщений об ошибке Undefined variable: reviews, она не определена, и это может быть потому, что if($input && $input != '') состояние не соответствует или $games ничего не получил, поэтому, попробуйте отладки шаг за шагом ваш код, сначала убедитесь, что контроль исполнения в настоящее время вводятся внутри if, сделав заявление dd($input) внутри if, а затем, если он выдает что-либо, убедитесь, что $games не имеет значение null/false, сделав заявление dd($games) после запроса игр.

Вы можете изменить фрагмент кода для этого

$input = Input::get('title'); 
if($input) { 
    $games = DB::table('games')->where('name', 'LIKE', "%$input%")->get(); 
    if($games) { 
     $reviews = []; // or array(); 
     foreach ($games as $game) { 
      $reviews[] = DB::table('reviews')->whereGame_id($game->id)->paginate(3); 
     } 
     return View::make('search', compact('reviews', 'input', 'games')); 
    } 
} 
// return a 404 (not found) or something like this or whatever, when nothing found 
+0

Я не могу использовать' $ reviews-> links() 'метод для получения paginator. Я получаю следующую ошибку, потому что $ review теперь является не объектом: 'Вызов функции-функции-члена() для объекта, не являющегося объектом. Ive попытался решить эту проблему, просто переведя ее в файл search.blade.php на объект, как этот '$ object = (object) $ review', но затем он говорит:« Вызовите undefined метод stdClass :: links () ' – hardking

+0

Поскольку' $ review' не является экземпляром 'paginator', это массив экземпляров' paginator'. Первым экземпляром 'paginator' является' $ review [0] '. –

+0

В вашем представлении каждый '$ review' (внутри цикла' foreach') является экземпляром 'paginator'. –