在laravel paginate中添加一些数据

时间:2016-12-08 07:49:53

标签: php laravel laravel-5 paginate

正如tittle所说,这是我的控制器

$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。 有什么想法吗?

4 个答案:

答案 0 :(得分:25)

您可以手动创建包含自定义数据的集合,并使用merge()帮助程序:

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

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

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

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

刚检查过,它运作正常。

答案 1 :(得分:5)

如果您“手动”使用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 :(得分:1)

paginate函数将返回Illuminate\Pagination\LengthAwarePaginator类型的对象,不可能只为此添加另一个字段。

我认为最适合您的解决方案是在数组中添加分页对象和其他值,并将此数组转换为json。这样,您的图书数据就会与您要添加的其他数据分开。

像这样:

check_valid_column(c) = valid(c) ? check_valid_column(c + 1) : c - 1
stats 'my.dat' using (check_valid_column(1)) nooutput

last_column = int(STATS_max)
plot 'my.dat' using 1:last_column

在这种情况下,您的json对象将如下所示:

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

答案 3 :(得分:0)

您也可以使用雄辩的方法从模型中获取数据,例如,假设每个数据都有汽车,书籍和宠物的列表。您的数据模型文件应具有声明与这些类“有很多”关系的方法,如下所示:

数据模型文件

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);

我希望这种选择对您或其他开发人员有用!