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