如何通过分页获取 Laravel Eloquent 中的特定列?
Posted
技术标签:
【中文标题】如何通过分页获取 Laravel Eloquent 中的特定列?【英文标题】:How to get specific columns in Laravel Eloquent with pagination? 【发布时间】:2019-04-01 12:10:57 【问题描述】:我使用这个表架构:
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'];
在控制器中,我想显示所有模型项目的列表,但只有 id
和 name
文件。现在我使用它,但它显示所有未隐藏的字段:
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()
仅显示我需要的字段?
【问题讨论】:
【参考方案1】:如果我没有错,那么希望您可以这样做以获取特定列以及分页:
return Form::paginate(100,['id','name',.....]);
【讨论】:
这是最简单的解决方案。谢谢!【参考方案2】:如果我正确阅读了您的问题,您要做的是创建一个 Form
对象的集合,其中实际上在索引概览中检索到 id
和 name
字段。
您可以通过在控制器中创建一个新的集合实例来轻松做到这一点:
public function index()
// use the Eloquent select() function
$forms = Form::select('id', 'name')->paginate(100);
return $forms;
我个人会将该集合放入存储库模式中,以使其更易于缓存。 Here's a nice canonical reference Laravel 中的存储库模式。
在您的控制器上的显示功能中,您无需更改任何内容,因为 ID 仍然相同。
为了将来的参考,请记住 paginate 方法仅对调用它的集合进行分页,而不是对与特定模型相关的所有内容或该集合以外的任何内容进行分页。因此,如果您以任何方式创建一个新集合,并在该新集合上调用 paginate 方法,则只会对其中的任何内容进行分页。这是相当强大的东西! Here's the documentation reference.
【讨论】:
Form::all('id', 'name')->paginate(100)
因为这个原因不能工作:Collection::paginate does not exist
,但 Form::select()
版本工作正常。谢谢!
啊,这很奇怪,我认为所有 Eloquent 函数都应该能够分页。还是删了。以上是关于如何通过分页获取 Laravel Eloquent 中的特定列?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?
Laravel/Eloquent 分页和 groupBy 用于 postgres 物化视图模型