질문을 삭제하지 말아주세요.!
 
1
0
-1

pagination 처리시에 마지막 페이지 내용이 첫번째 페이지 내용중 일부가 중복되어 나옵니다.

다음과 같은 테스트를 해보았습니다.

latest('id) 로 하면 각 페이지 마다 정상적으로 나옵니다.

lastest() 만 하면 반듯이 마지막 페이지가 첫번째 페이지의 일부가 중복되어 출력 됩니다.

아무리 해봐도...해결이 되지 않네요. 의견 부탁드립니다. ㅠㅠ



<블레이드>

<div class="panel">
<div class="panel-heading"></div>
<div class="panel-body">
<div class="table-responsive">
<table class="table table-bordered table-hover table-condensed table-condensed background-color: black">
<thead>
<tr>
<th class="text-center" scope="row">
<input type="checkbox" name="chkall" id="chkall"/>
</th>
<th class="text-left">고유번호</th>
<th class="text-left">발란코드</th>
<th class="text-left">키즈코드</th>
<th class="text-left">수집업체</th>
<th class="text-left">브랜드명</th>
<th class="text-left">상품이름</th>
<th class="text-left">제고</th>
<th class="text-left">최종수집일</th>
<th class="text-left">등록일자</th>
<th class="text-center">수집하기</th>
<th class="text-center">수집주소</th>
<th class="text-center">송출여부</th>
<th class="text-center">상세보기</th>
</tr>
</thead>
<tbody>
@foreach ($products as $product)
<tr>
<th class="text-center" scope="row">
<input type="checkbox" name="chk[]" class="list-chkbox" value="#">
</th>
<td>{{ $product->id }}</td>
<td>{{ isset($product->target->name) ? $product->target->name : null}}</td>
<td>{{ isset($product->target_product_id) ? $product->target_product_id : null }}</td>
<td>{{ $product->shop->name }}</td>
<td>{{ $product->brand_name }}</td>
<td>{{ $product->name }}</td>
<td>{{ isset($product->stock_max) ? $product->stock_max: '0' }}</td>
<td>{{ $product->crawl_last_time }}</td>
<td>{{ $product->created_at }}</td>
<td class="text-center">
<button type="button" class="btn btn-xs btn-default"><i
class="fa fa-hand-lizard-o"></i>
</button>
</td>
<td class="text-center">
<button type="button" class="btn btn-xs btn-default"><i
class="fa fa-file-text-o"></i>
</button>
</td>
<td class="text-center">
@if(isset($product->target->name) && $product->target->name == 'adult')
<button type="button" class="btn btn-xs btn-info">ADT</button>
@elseif(isset($product->target->name) && $product->target->name == 'kid')
<button type="button" class="btn btn-xs btn-warning">KID</button>
@else
@endif
</td>
<td class="text-center">
<a href="{{ route('products.show', $product->id) }}"><i
class="fa fa-align-left"></i></a>
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="text-center">
{!! $products->appends(Input::except('page'))->render() !!}
</div>

</div>
</div>
</div>


<Route>


Route::prefix('products')->group(function () {

# PRODUCT DASHBORAD ROUT
Route::get(
'/',
'ProductController@index'
)->name('products.index');

Route::get(
'{malltype}/news',
'ProductController@new'
)->where('malltype', 'adult|kid')->name('products.sub.news');


Route::get(
'{malltype}',
'ProductController@index'
)->where('malltype', 'adult|kid')->name('products.sub.index');


Route::get(
'{id}',
'ProductController@show'
)->where('id', '[0-9]+')->name('products.show');

Route::post(
'action',
'ProductController@action'
)->name('products.action');

});

<controller>

public function new(Request $request, $malltype)
{
$request->flash();

$products = Product::with(['shopurl','target','shop'])
->where('created_at', '>=', (Input::get('startdate')) ? Input::get('startdate') : Carbon::now()->format('Y-m-d H:i:s'))
->where('created_at', '<=', (Input::get('enddate')) ? Input::get('enddate') : Carbon::now()->format('Y-m-d H:i:s'))
->where('target_is_opened', '=', null)
->latest()->paginate(15);

return view('products.productNew', [
'products' => $products,
'malltype' => $malltype,
]);
}

<출력화면 : 첫번째 페이지>

<출력화면 : 마지막 페이지>


마지막 페이지를 보면 첫번째 페이지의 데이타 중 일부가 중복되어 나옵니다.


Product Table 에는 100개의 Row 가 들어가 있습니다.

다만, Created_at 컬럼의 시간이 모두 같습니다.


    CommentAdd your comment...

    3 answers

    1.  
      1
      0
      -1

      마지막 문장에서 이미 답을 말씀하셨습니다. 파운데이션에서 제공하는 latest() API를 보면 created_at 역순으로 정렬하도록 되어 있습니다.
      https://github.com/laravel/framework/blob/5.4/src/Illuminate/Database/Query/Builder.php#L1436-L1439

      1) 자동 증가 키를 사용할 때 생성 시각 역순으로 정렬하고자 할 때는 latest() API를 쓰는 것 보다, orderBy('id', 'desc')를 쓰는 것이 유리합니다. id 컬럼은 인덱싱이 되어 있고, created_at은 그렇지 않기 때문입니다.
      2) 시딩으로 대량 테스트 데이터를 생성할 때 ($now = \Carbon\Carbon::now(); 변수 세팅되어 있다고 가정), 루프를 돌때마다 'created_at' => $now->addSecond()를 해서 레코드 생성시각도 현실적으로 만들어주면 더 좋을 것 같습니다.

      1. dangtong

        아넵 그런 방법이 있었네요...감사합니다. 시딩할때 참고 하겠습니다.

      CommentAdd your comment...
    2.  
      1
      0
      -1

      감사합니다. 

      ->orderBy('created_at','desc')
      ->orderBy('id','desc')

      요렇게 하니깐 되네요..

        CommentAdd your comment...
      1.  
        1
        0
        -1

        created_at이 전부 동일한 시간이라면 정렬 문제인것 같은데 order by에 pk도 추가하시는걸 추천드립니다.

          CommentAdd your comment...