如何通过分页获取Laravel Eloquent中的特定列?

时间:2018-10-28 10:46:23

标签: laravel eloquent laravel-5.7 laravel-pagination

我使用此表模式:

Schema::create('forms', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name', 255)->default('');
    $table->text('html')->nullable();
    $table->text('json')->nullable();

    $table->timestamps();
    $table->softDeletes();
});

这是模型:

class Form extends Model
{
    use SoftDeletes;

    protected $fillable = [
        'name',
        'html',
        'json'
    ];

    protected $hidden = ['created_at', 'updated_at', 'deleted_at'];
}

在控制器中,我想显示所有模型项的列表,但仅列出idname。现在,我使用它,但是它显示所有未隐藏的字段:

public function index() {
    return Form::->paginate(100);
}

此功能仅适用于表单名称列表。但是这是第二个用于显示要修改的表单数据的

public function show(string $id) {
    $item = Form::findOrFail($id);

    return response()->json($item);
}

当然,这最后一个功能需要显示所有字段(id,name,html和json也是如此)。

是否有最佳实践来仅显示与index()一起使用的paginate()函数中需要的字段?

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了您的问题,那么您想要做的是创建一个Form对象的集合,其中实际上仅在索引概述中检索到idname字段

您可以通过在控制器中创建一个新的集合实例来轻松地做到这一点:

public function index() {
   // use the Eloquent select() function
   $forms = Form::select('id', 'name')->paginate(100);
   return $forms;
}

我个人会将该集合放在存储库模式中,以使其更易于缓存。 Here's a nice canonical reference到Laravel中的存储库模式。

在控制器的show功能中,无需更改任何东西,因为ID仍然相同。

为将来参考,请记住paginate方法仅对调用的集合进行分页,而不对与特定模型相关的所有内容或该集合以外的任何内容进行分页。因此,如果您以任何方式创建新集合,并对该新集合调用paginate方法,则仅对其中的任何内容进行分页。这是非常强大的东西! Here's the documentation reference.

答案 1 :(得分:1)

如果我没记错的话,那么希望您可以这样做以获取带有分页的特定列:

return Form::paginate(100,['id','name',.....]);