Разбиение на страницы Laravel (с внешним ключом)

Я пытаюсь получить некоторые данные из базы данных с помощью Laravel. Часть выборки работает нормально, пока я не хочу использовать разбиение на страницы для данных.

В моем контроллере (RepairController) я использую эту функцию, чтобы получить все (без разбиения на страницы):

$pendingRepairs = Repair::get()->where('status.completed', 0);

Это прекрасно работает. Пока я не добавлю функцию пагинации. Затем мне выдает ошибку:

BadMethodCallException
Method Illuminate\Database\Eloquent\Collection::paginate does not exist.

Некоторые исследования в Интернете показывают мне, что мне нужно удалить часть ::get(). Но как? Какова альтернатива использованию части get, поскольку я использую значение внешнего ключа status.completed?

Мой ремонтный контроллер:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repair;

class RepairController extends Controller
{
    public function index()
    {
        $allRepairs = Repair::get();
        $pendingRepairs = Repair::get()->where('status.completed', 0)->paginate(2);
        $doneRepairs = $allRepairs->where('status.completed', 1);

        return view('repair.index', [
            'pendingRepairs' => $pendingRepairs, 'doneRepairs' => $doneRepairs
        ]);
    }
....
}

В Repair.php у меня есть ссылка на статусы:

public function status() 
    {
        return $this->belongsTo(\App\Status::class);
    }

Любые идеи? Спасибо :)


person Marvin    schedule 15.03.2021    source источник


Ответы (3)


Вы можете использовать whereHas(), чтобы добавить ограничения на отношения.

$pendingRepairs = Repair::whereHas('status', function($query) {
    $query->where('completed', 0);
})
->paginate();
person Anurat Chapanond    schedule 15.03.2021

Есть много способов сделать это. Во-первых, где ответил Anurat.

Есть еще один способ просто присоединиться к нужному столу

В разных ситуациях они будут работать с разной сложностью. Обратите внимание, что whereHas сделает subselect

$pendingRepairs = Repair::query()
    ->join('statuses', 'statuses.repair_id', 'repairs.id')
    ->where('statuses.completed', 0)
    ->select('repairs.*')
    ->paginate();

В случае, когда имена ваших таблиц: repairs statuses и у вас есть внешний ключ repair_id, если не просто заменить их :)

person Rob    schedule 15.03.2021

Спасибо за все отклики.

Я думаю, что все они будут работать. Но я узнал об использовании таблиц данных (datatables.net). Поскольку это добавит саму разбивку на страницы, мне больше не нужен Larvel.

person Marvin    schedule 15.03.2021