Как получить определенные столбцы в 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. Сейчас я использую это, но в нем отображаются все не скрытые поля:

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()?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
0
1 539
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно прочитал ваш вопрос, то, что вы хотите сделать, это создать коллекцию объекта Form, где в обзоре индекса фактически извлекаются только поля id и name.

Вы можете сделать это довольно легко, создав новый экземпляр коллекции в вашем контроллере:

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

Я бы лично поместил эту коллекцию в шаблон репозитория, чтобы облегчить кеширование. Вот хорошая каноническая ссылка к шаблонам репозитория в Laravel.

В вашей функции show на вашем контроллере вам не нужно ничего менять, учитывая, что идентификатор все тот же.

Для справки в будущем помните, что метод paginate разбивает на страницы только ту коллекцию, которую он вызывает, а не все, что связано с конкретной моделью или чем-либо, кроме этой коллекции. Таким образом, если вы каким-либо образом создадите новую коллекцию и вызовете метод paginate для этой новой коллекции, только то, что находится внутри, будет разбито на страницы. Это довольно мощная штука! Вот ссылка на документацию.

Form::all('id', 'name')->paginate(100) не работает из-за этого: Collection::paginate does not exist, но версия Form::select() работает нормально. Спасибо!
netdjw 28.10.2018 18:48

Ах, это странно, я думал, что все функции Eloquent должны иметь возможность разбиения на страницы. Все равно удалил.

Extricate 28.10.2018 19:02
Ответ принят как подходящий

Если я не ошибаюсь, то, надеюсь, вы можете сделать что-то вроде этого для получения определенных столбцов вместе с разбивкой на страницы:

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

Это наиболее простое решение. Спасибо!

netdjw 28.10.2018 18:50

Другие вопросы по теме