2015-06-16 2 views
4

Я делаю разбивку по страницам Laravel на основе моего запроса и получаю на мой взгляд. Я следую за это руководство http://laravel.com/docs/5.1/pagination, но я получаю сообщение об ошибке:Laravel 5 Разбиение страницы с помощью Query Builder

Call to a member function paginate() on a non-object 

Я использую конструктор запросов, так что я думаю, что должно быть в порядке? Вот мой код

public function getDeliveries($date_from, $date_to) 
{ 
    $query = "Select order_confirmation.oc_number as oc, 
    order_confirmation.count as cnt, 
    order_confirmation.status as stat, 
    order_confirmation.po_number as pon, 
    order_summary.date_delivered as dd, 
    order_summary.delivery_quantity as dq, 
    order_summary.is_invoiced as iin, 
    order_summary.filename as fn, 
    order_summary.invoice_number as inum, 
    order_summary.oc_idfk as ocidfk, 
    order_summary.date_invoiced as di 
    FROM 
    order_confirmation,order_summary 
    where order_confirmation.id = order_summary.oc_idfk"; 

    if (isset($date_from)) { 
     if (!empty($date_from)) 
     { 
      $query .= " and order_summary.date_delivered >= '".$date_from."'"; 
     } 
    } 

    if (isset($date_to)) { 
     if (!empty($date_to)) 
     { 
      $query .= " and order_summary.date_delivered <= '".$date_to."'"; 
     } 
    } 

    $query.="order by order_confirmation.id ASC"; 

    $data = DB::connection('qds106')->select($query)->paginate(15); 
    return $data; 
} 

Однако, когда я удаляю пагинат (15); он отлично работает.

Благодаря

+0

Привет, у меня была та же проблема с QueryBuilder, так как получить() работает после того, как где() -> получить (), но paginate() нет. Вы нашли решение этой проблемы? – mango

ответ

0

постраничному будет работать только с красноречивыми моделями. читать pagination. вы можете перевести все ваши запросы, в том числе, если заявления в Eloquent

+0

Куда выйдет мой выбор? qds106 - это всего лишь строка соединения. – jackhammer013

+0

@JoeneFloresca обновите свой ответ. есть ли причина, по которой вы не хотите использовать Eloquent? – Junaid

+0

Я еще не знаком с Eloquent, у меня также нет идеи о том, как перевести мой запрос в Eloquent query. Но в руководстве говорится, что поддерживаются как Eloquent, так и Query Builder? – jackhammer013

1

в документе на этой странице: http://laravel.com/docs/5.1/pagination мы можем видеть, что мы не вынуждены использовать красноречивый.

но, не забудьте, что вы не делаете groupBy в своем запросе, потому что метод paginate использует его.

после того, как я не уверен, что вы можете использовать постраничный с построитель запросов (select($query))

--- редактировать

Вы можете создавать коллекции неповторимые использовать класс Paginator:

$collection = new Collection($put_your_array_here); 

// Paginate 
$perPage = 10; // Item per page 
$currentPage = Input::get('page') - 1; // url.com/test?page=2 
$pagedData = $collection->slice($currentPage * $perPage, $perPage)->all(); 
$collection= Paginator::make($pagedData, count($collection), $perPage); 

и на ваш взгляд, просто используйте $collection->render();

1
public function getDeliveries($date_from, $date_to) 
{ 
    $query="your_query_here"; 
    $deliveries = DB::select($query); 

    $deliveries = collect($deliveries); 
    $perPage = 10; 
    $currentPage = \Input::get('page') ?: 1; 
    $slice_init = ($currentPage == 1) ? 0 : (($currentPage*$perPage)-$perPage); 
    $pagedData = $users->slice($slice_init, $perPage)->all(); 
    $deliveries = new LengthAwarePaginator($pagedData, count($deliveries), $perPage, $currentPage); 
    $deliveries ->setPath('set_your_link_page'); 
    return $deliveries; 
} 
+1

Итак, если у меня есть таблица с миллионом строк, которые я хотел бы разбивать на страницы, мне нужно получить весь миллион? Не похоже на хороший подход. – IceFire

1

Вы с и др его с помощью пользовательского разбиения на страницы ..

$query = "Your Query here"; 

$page = 1; 
$perPage = 5; 
$query = DB::select($query); 
$currentPage = Input::get('page', 1) - 1; 
$pagedData = array_slice($query, $currentPage * $perPage, $perPage); 
$query = new Paginator($pagedData, count($query), $perPage); 
$query->setPath('Your Url'); 

$this->data['query'] = $query; 

return view('Your_view_file', $this->data, compact('query')); 

Здесь вы можете указать путь, используя setpath().

В вашем View

@foreach($query as $rev) 
//Contents 
@endforeach 
<?php echo $Reviews->appends($_REQUEST)->render(); ?> 

appends будет добавлять данные.

спасибо.

+0

Опять же, вы берете ВСЕ строки и потом фильтруете их, я определенно делаю ограничение в базе данных – IceFire

0

это так, как я сделал, это использовать конструктор запросов и получить тот же результат с пагинацией

$paginateNumber = 20; 

    $key = $this->removeAccents(strip_tags(trim($request->input('search_key', '')))); 
    $package_id = (int)$request->input('package_id', 0); 
    $movieHasTrailer = MovieTrailer::select('movie_id')->where('status','!=','-1')->distinct('movie_id')->get(); 

    $movieIds = array(); 

    foreach ($movieHasTrailer as $index => $value) { 
     $movieIds[] = $value->movie_id; 
    } 


    $keyparams = array(); 
    $packages = Package::select('package_name','id')->get(); 

    $whereClause = [ 
     ['movie.status', '!=', '-1'], 
     ['movie_trailers.status', '!=', '-1'] 
    ]; 

    if(!empty($key)){ 
     $whereClause[] = ['movie.title', 'like', '%'.$key.'%']; 
     $keyparams['search_key'] = $key; 
    } 

    if($package_id !== 0){ 
     $whereClause[] = ['movie.package_id', '=', $package_id]; 
     $keyparams['package_id'] = $package_id; 
    } 



    $movies = DB::table('movie') 
      ->leftJoin('movie_package','movie.package_id','=','movie_package.id') 
      ->leftJoin('movie_trailers','movie.id','=','movie_trailers.movie_id') 
      ->where($whereClause) 
      ->whereIn('movie.id',$movieIds) 
      ->select('movie.*','movie_package.package_name','movie_trailers.movie_id as movie_id', 
       DB::raw('count(*) as total_trailers, movie_id') 
      ) 
      ->groupBy('movie.id') 
      ->paginate($paginateNumber); 
+0

, это сработало для меня – Phong

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