我正在使用PHP / Laravel開發一個小專案,但是我在大約 3 天后遇到了一個錯誤,我嘗試自己修復它,但我不能。
這是我的代碼:
public function getCollection()
{
$queryStrings = $this->getQueryStrings();
if(count($queryStrings)){
// dd($queryStrings);
$filteredOrSorteredCollection = $this->sortOrFilterCollection(
$this->queryBuilder,
$queryStrings
);
return $this->collection = $this->generateResults($filteredOrSorteredCollection);
}
return $this->collection = $this->generateResults($this->queryBuilder);
}
public function sortOrFilterCollection($collection, $parseInfo)
{
foreach($parseInfo as $key => $info){
switch($key){
case 'sort':
$this->sortCollection($collection, $info);
break;
case 'search':
// dd($collection->toSql());
// dd($info);
$this->searchCollection($collection, $info);
break;
// need more here
}
}
}
private function searchCollection($collection, $info)
{
$countKeys = count(array_keys($info));
if($countKeys > 1){
dd('error'.__METHOD__);
}
if($countKeys == 1){
// dd(12);
$collection->where(function($collection) use ($info) {
foreach($this->columns as $column){
if(isset($column['searchable']) && $column['searchable'] == true){
$this->resolve($collection, $column['index'], 'like', '%' . $info['all'] . '%', 'orWhere');
}
}
});
}
}
private function resolve($collection, $columnName, $condition, $filterValue, $clause = 'where', $method = 'resolveQuery')
{
if($this->enableFilterMap && isset($this->filterMap[$columnName])){
$this->$method($collection, $this->filterMap[$columnName], $condition, $filterValue, $clause);
// dd('block 1');
} else if ($this->enableFilterMap && !isset($this->filterMap[$columnName])){
// dd('block 2');
$this->$method($collection, $columnName, $condition, $filterValue, $clause);
} else {
dd('block 3');
$this->$method($collection, $columnName, $condition, $filterValue, $clause);
}
}
private function resolveQuery($query, $columnName, $condition, $filterValue, $clause = 'where')
{
if($clause === 'whereBetween'){
return $query->$clause($columnName, $filterValue);
} else {
return $query->$clause($columnName, $this->operators[$condition], $filterValue);
}
}
public function generateResults($queryBuilderOrCollection)
{
// dd($queryBuilderOrCollection);
if($this->paginate){
if($this->itemsPerPage > 0){
// dd(5);
return $this->paginateResults($queryBuilderOrCollection);
}
}else{
return $this->defaultResults($queryBuilderOrCollection);
}
}
我嘗試使用 dd 進行多次除錯以從頭到尾跟蹤每個變數,
順便說一下, resovleQuery (其他部分)作業得很好,我得到了我使用dd.
結果總是:
Call to a member function orderBy() on null
private function paginateResults($queryBuilderOrCollection){
// dd($queryBuilderOrCollection);
return $this->collection = $queryBuilderOrCollection->orderBy($this->index, $this->sortOrder)->paginate($this->itemsPerPage);
}
uj5u.com熱心網友回復:
編輯:在第二次審查中,在下面的“但是”之后嘗試我的第二個建議,如果不起作用,請嘗試第一個。
在getCollection()您傳遞sortOrFilterCollection()to的結果時generateResults(),它會呼叫paginateResults()發生錯誤的位置。
$filteredOrSorteredCollection = $this->sortOrFilterCollection(
$this->queryBuilder,
$queryStrings
);
return $this->collection = $this->generateResults($filteredOrSorteredCollection);
但是,sortOrFilterCollection() 不回傳任何內容,因此$filteredOrSorteredCollection將回傳null。(旁注:“Sortered”有一個錯字,您可能想將其更改為“Sorted”。)我認為您需要更改sortOrFilterCollection()以回傳它正在呼叫的函式的結果,這也意味著您可以洗掉break宣告,像這樣:
public function sortOrFilterCollection($collection, $parseInfo)
{
foreach($parseInfo as $key => $info){
switch($key){
case 'sort':
return this->sortCollection($collection, $info);
case 'search':
// dd($collection->toSql());
// dd($info);
return $this->searchCollection($collection, $info);
// need more here
}
}
}
但是,您也不會從searchCollection或回傳任何內容resolve。
因此,再想一想,您的代碼可能被設計為通過修改$queryBuilder參考來作業。在這種情況下,您實際上可能需要將這些getCollection()行更改為:
// Modify `$this->queryBuilder` object
$this->sortOrFilterCollection(
$this->queryBuilder,
$queryStrings
);
return $this->collection = $this->generateResults($this->queryBuilder);
我不確定你的代碼是如何設計的,所以要么你需要向return其他幾個函式添加陳述句,要么你不應該期望回傳值而你需要傳遞queryBuilder。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351805.html
