Я использую эту схему таблицы:
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()?






Если я правильно прочитал ваш вопрос, то, что вы хотите сделать, это создать коллекцию объекта Form, где в обзоре индекса фактически извлекаются только поля id и name.
Вы можете сделать это довольно легко, создав новый экземпляр коллекции в вашем контроллере:
public function index() {
// use the Eloquent select() function
$forms = Form::select('id', 'name')->paginate(100);
return $forms;
}
Я бы лично поместил эту коллекцию в шаблон репозитория, чтобы облегчить кеширование. Вот хорошая каноническая ссылка к шаблонам репозитория в Laravel.
В вашей функции show на вашем контроллере вам не нужно ничего менять, учитывая, что идентификатор все тот же.
Для справки в будущем помните, что метод paginate разбивает на страницы только ту коллекцию, которую он вызывает, а не все, что связано с конкретной моделью или чем-либо, кроме этой коллекции. Таким образом, если вы каким-либо образом создадите новую коллекцию и вызовете метод paginate для этой новой коллекции, только то, что находится внутри, будет разбито на страницы. Это довольно мощная штука! Вот ссылка на документацию.
Ах, это странно, я думал, что все функции Eloquent должны иметь возможность разбиения на страницы. Все равно удалил.
Если я не ошибаюсь, то, надеюсь, вы можете сделать что-то вроде этого для получения определенных столбцов вместе с разбивкой на страницы:
return Form::paginate(100,['id','name',.....]);
Это наиболее простое решение. Спасибо!
Form::all('id', 'name')->paginate(100)не работает из-за этого:Collection::paginate does not exist, но версияForm::select()работает нормально. Спасибо!