web-dev-qa-db-ja.com

laravel paginateにデータを追加します

タイトルが言ったように、これが私のコントローラーです

$book = Data::where('userId','1')->paginate(3);

return response()->json($book);

そして、次のようなjsonデータを取得します。

data:[{id: 1, userId: 1, vendorId: 1, name: "Alfreda Berge PhD", phone: "1-850-813-5950 x96169",…},…]
from:1
last_page:2
next_page_url: "http:/localhost/XX/public/user/book/list/1?page=2"
perpage:4
prev_page_url:null
to:4
total:5
// if I want to add a new column and value here ,what should I do? 

私はこれをやろうとしました:

$book = Data::where('userId','1')->paginate(3);
$book->printWord = 'Hellow!';
return response()->json($book);

ただし、printWord列は削除されるようです。何か案が?

11
Fan

カスタムデータを使用してコレクションを手動で作成し、 merge() ヘルパーを使用できます。

$book = Data::where('userId','1')->paginate(3);

$custom = collect(['my_data' => 'My custom data here']);

$data = $custom->merge($book);

return response()->json($data);

チェックしたところ、問題なく動作します。

29
Alexey Mezenin

Illuminate\Pagination\LengthAwarePaginator クラスを「手動で」使用する場合、それを拡張してtoArrayメソッドをオーバーライドするオプションがあります。

return new class(
    $collection,
    $count,
    $limit,
    $page,
    // https://github.com/laravel/framework/blob/6.x/src/Illuminate/Pagination/LengthAwarePaginator.php#L40
    // values here will become properties of the object
    [
        'seed' => $seed
    ]
) extends LengthAwarePaginator {
    public function toArray()
    {
        $data = parent::toArray();
        // place whatever you want to send here
        $data['seed'] = $this->seed;
        return $data;
    }
};

結果

current_page    1
data    []
first_page_url  "/finder?max_miles=100&Zip_code=10001&seed=0.2&page=1"
from    null
last_page   1
last_page_url   "/finder?max_miles=100&Zip_code=10001&seed=0.2&page=1"
next_page_url   null
path    "/Finder"
per_page    20
prev_page_url   null
to  null
total   0
seed    0.2 // <-- our custom prop

LengthAwarePaginatorを自分でインスタンス化するには、追加の作業が必要ですが、それで仕事が完了します。

2
BrunoRB

Paginate関数は、タイプ Illuminate\Pagination\LengthAwarePaginator のオブジェクトを返します。これに別のフィールドを追加することはできません。

あなたにとって最良の解決策は、ページネーションオブジェクトと他の値を配列に追加し、この配列をjsonに変換することだと思います。この方法で、あなたの本のデータはあなたが追加したい他のデータから分離されます。

そのようです:

return response()->json([
    'books' => $books,
    'foo' => 'bar'
]);

この場合、jsonオブジェクトは次のようになります。

{
    books: {
        // Pagination object with books
    }
    foo: 'bar'
}
1
Jerodev

モデルからデータを取得することもできます。たとえば、各データに車、本、ペットのリストがあるとします。データモデルファイルには、以下のように、これらのクラスとの「多数」の関係を宣言するメソッドが必要です。

データモデルファイル

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Data extends Model{

protected $table = 'data';

protected $fillable = [
    'id', 'user_id', 'vendorId', 'name', 'phone'
];

public function cars(){
    return $this->hasMany(Car::class);
}

public function books(){
    return $this->hasMany(Book::class);
}

public function pets(){
    return $this->hasMany(Pet::class);
}

また、すべてのCar、Book、Petモデルに「belongsTo」メソッドが必要です。

車種ファイル

...
public function data(){
    return $this->belongsTo(Data::class);
}
...

最後に、ページ分割された結果を取得し、車、本、ペットに関連するすべてのデータを使用して、実装は次のようになります。

コントローラーのメソッド

$data_elements = Data::where('userId','1')->paginate(3);

foreach($data_elements as $d){
    $d->cars;
    $d->books;
    $d->pets;
}

return response()->json($data_elements);

この代替案があなたや他の開発者に役立つことを願っています!

0
Yor Jaggy