我正在尝试用Laravel从数据库中获取一些数据。获取部分工作得很好,直到我想对数据使用分页。
在我的控制器(RepairController)中,我使用这个函数来获取所有内容(没有分页):
$pendingRepairs = Repair::get()->where('status.completed', 0);这可以很好地工作。直到我添加了分页函数。然后它会给我一个错误:
BadMethodCallException
Method Illuminate\Database\Eloquent\Collection::paginate does not exist.互联网上的一些研究表明,我需要删除::get()部分。但是怎么做呢?既然我使用了status.completed外键值,那么使用get部分的替代方法是什么?
我的RepairController:
<?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);
}有什么想法吗?谢谢:)
发布于 2021-03-16 00:17:10
谢谢你所有的回复。
我想它们都会起作用的。但我已经了解了数据表(datatables.net)的用法。因为这将添加分页本身,所以我不再需要Larvel一次。
发布于 2021-03-15 23:32:25
您可以使用whereHas()在关系上添加约束。
$pendingRepairs = Repair::whereHas('status', function($query) {
$query->where('completed', 0);
})
->paginate();发布于 2021-03-16 00:00:46
有很多方法可以做到这一点。第一件事是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外键,如果不是这样,只需替换它们:)
https://stackoverflow.com/questions/66640630
复制相似问题