Laravel 分页(使用外键)

Laravel paginate (with foreign key)

我正在尝试使用 Laravel 从数据库中获取一些数据。获取部分工作正常,直到我想对数据使用分页。

在我的控制器 (RepairController) 中,我使用这个函数来获取所有内容(没有分页):

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

这很好用。直到我添加分页功能。然后它给我一个错误:

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

互联网上的一些研究表明我需要删除 ::get() 部分。但是怎么办?因为我使用 status.completed 外键值,所以使用 get 部分的替代方法是什么?

我的修复控制器:

<?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 我有一个 link 状态:

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

有什么想法吗?谢谢:)

您可以使用whereHas()来添加关系约束。

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

有很多方法可以做到这一点。首先是 Anurat 回答的 whereHas。

还有另一种方法可以加入table你需要

在不同的情况下,它们的工作复杂度也不同。 请注意,whereHas 会执行 subselect

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

如果您的 table 名称是:repairs statuses 并且您有 repair_id 外键,如果没有则直接替换它们:)

感谢大家的回复。

我认为它们都会起作用。但是我发现了数据表的使用(datatables.net)。 因为那会自己添加分页,所以我不再需要 Larvel 了。