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);
    }

有什么想法吗?谢谢:)

解决方法

您可以使用 interface squareType { value: string,} // Defining a tuple which will allow us to set a max length of each row type rowTuple = [squareType,squareType,squareType] // define a 3*3 grid type gridTuple = [rowTuple,rowTuple,rowTuple] function isRowTuple(possibleRow: squareType[]): possibleRow is rowTuple { return (possibleRow.length === 3) ? true : false } // type guard to check if it is a grid tuple function isGridTuple(possibleGrid: rowTuple[]): possibleGrid is gridTuple { // check if the length is correct return true } function App() { const [appState,setAppState] = useState<gridTuple | undefined>() // build a grid useEffect(() => { let grid: rowTuple[] = [] for (let y = 1; y <= 3; y++) { let row: squareType[] = [] for (let x = 1; x <= 3; x++) { let sq: squareType; sq = { value: 'kudos',} row.push(sq) } // change type of row to rowTuple isRowTuple(row) grid.push(row) // error is here } },[]) 添加关系约束。

whereHas()
,

有很多方法可以做到这一点。第一件事是Anurat回答了 whereHas。

还有另一种方式来连接你需要的表

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

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

如果您的表名是:repairs statuses 并且您有 repair_id 外键,如果不只是替换它们:)

,

感谢所有回复。

我认为它们都会起作用。但我发现了使用数据表(datatables.net)。 由于这将添加分页本身,我不再需要 Larvel 一次了。