问题描述
我正在尝试使用 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
]);
}
....
}
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 一次了。