laravel5.2 ページネーションは便利だけど便利じゃない

ページネーションすごい

自動でHTML生成までしてくれる。

<?php

namespace App\Http\Controllers;

use DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    public function index()
    {
        $users = DB::table('users')->paginate(15); // (1)

    }
}

この(1)の数字変えれば、1ページに表示する分のデータを取得し、さらに全体の件数から計算してbootstrap用のリンクまで生成してくれます。

さらに、

$users = User::where('votes', '>', 100)->paginate(15);

こんなふうに、EloquentモデルでもOK。

しかも、クエリストリングスからpageという値を自動で読み取ってくれる。コーディング不要。
生成するリンクにも?page=xxxが付与されてる。なんだこれ簡単すぎる!!

ちなみにHTMLの生成にはVIEWで

{!! $users->render() !!}

こんなふう。データの取得は

@foreach($users->items as $record)

こんなふう。

あれ?なんで怒られてんの?

んで僕はいろいろJOINしたりなんだりがあったのでSQLを書いた。

<?php

$sql = <<<SQL
SELECT 
A.counter, B.seq, B.user_id, C.type FROM favorites AS A 
JOIN results AS B ON A.id = B.id
JOIN settings AS C ON A.counter = C.counter 
WHERE A.user_id = ?
SQL;

$data = DB::connection($this->connection)->select($sql, [$user_id])->paginate(10);

動きません…。

どうもオブジェクトじゃなきゃダメみたい。

laravel不思議なんですけど、直接SQL書いたり、もしくはクエリービルダー使うと戻り値が配列なんですよね。でも、そのレコードの中身のカラムはオブジェクトというちょっと気持ち悪い感じで返ってきます。

<?php

foreach($result as $record) {
    $score .= $record->point;
}

みたいなコードになります。なんか設定あるのかは不明。

使えないじゃん!

結局こんな感じ。

<?php
public function getMyFavoriteList($user_id, $page = 0)
{
        $parPage = 10;
        $offset = $parPage * $page;

        // データ取得
        $sql = <<<SQL
SELECT 
A.counter, B.seq, B.user_id, C.type FROM favorites AS A 
JOIN results AS B ON A.id = B.id
JOIN settings AS C ON A.counter = C.counter 
WHERE A.user_id = ? LIMIT ? OFFSET ?
SQL;
        $data = DB::connection($this->connection)->select($sql, [$user_id, $parPage, $offset]);


        // 総ページ数取得
        $sql = <<<SQL
SELECT 
count(A.counter) AS agreegate
FROM favorites AS A 
JOIN results AS B ON A.id = B.id
JOIN settings AS C ON A.counter = C.counter 
WHERE A.user_id = ?
SQL;
        $total = DB::connection($this->connection)->select($sql, [$user_id]);

        // ページネーションリンク生成
        $result = new LengthAwarePaginator($data_array, $total[0]->agreegate, $parPage); // (1)

        $result->setPath('/favorite'); // (2)

        return $result;

自動でやってくれてる所を一部自分で。 必要なデータの取得と全件数の取得を行い、(1)の

LengthAwarePaginator()

ってのにいれる。

<?php
use Illuminate\Pagination\LengthAwarePaginator;

わすれずに。

ちなみに(2)は生成してくれるリンクのURLを設定するメソッドです。