【发布时间】:2018-03-31 19:02:16
【问题描述】:
我正在按照教程编写 2 个用于过滤论坛应用程序中的线程的类。我遇到了这个错误
$threads = Thread::latest()->filter($filters); // in threadscontroller
错误:
方法 Illuminate\Database\Query\Builder::filter 不存在。
ThreadsController 带索引方法:
<?php
namespace App\Http\Controllers;
use App\Thread;
use App\Channel;
use App\Filters\ThreadFilters;
use Illuminate\Http\Request;
class ThreadsController extends Controller
{
public function __construct(){
$this->middleware('auth')->only('store','create');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Channel $channel,ThreadFilters $filters)
{
$threads = Thread::latest()->filter($filters);
if($channel->exist){
$threads->where('channel_id',$channel->id);
}
$threads = $threads->get();
return view('threads.index',compact('threads'));
}
这是抽象类过滤器:
<?php
namespace App\Filters;
use Illuminate\Http\Request;
abstract class Filters{
protected $request;
protected $builder;
protected $filters = [];
public function __construct(Request $request){
$this->request = $request;
}
public function apply($builder){
$this->builder = $builder;
foreach($this->getFilters() as $filter=>$value){ //filter by,value yunus mesela.
if(method_exist($this,$filter)){
$this->$filter($value);
}
}
return $this->builder;
}
public function getFilters(){
return $this->request->intersect($this->filters);
}
}
这里 ThreadFilters.php 扩展了过滤器类:
<?php
namespace App\Filters;
use App\User;
use Illuminate\Http\Request;
class ThreadFilters extends Filters
{
protected $filters =['by'];
protected function by($username){
$user = User::where('name',$username)->firstorFail();
return $this->builder->where('user_id',$user->id);
}
}
如果我将 latest 更改为 all,我会收到此 错误:
类型错误:参数 1 传递给 Illuminate\Support\Collection::filter() 必须是可调用的或为空的, 给定对象,调用
还有谁能解释一下 $builder 在这些类中做什么?
【问题讨论】: