Php 为什么在laravel中不存在错误生成器::查询?

Php 为什么在laravel中不存在错误生成器::查询?,php,laravel,laravel-5,Php,Laravel,Laravel 5,在索引函数中,我有一个查询,基于角色和id,查询得到更改 以下是索引方法中我的控制器中的脚本 public function index(Request $request) { $data = $request->validate([ 'id' => 'sometimes|nullable|string|max:10', ]); $networks = []; $user = Auth::user(); if($u

在索引函数中,我有一个查询,基于角色和id,查询得到更改

以下是索引方法中我的控制器中的脚本

public function index(Request $request)
{

    $data = $request->validate([
        'id' => 'sometimes|nullable|string|max:10',
    ]);


    $networks = [];

    $user   = Auth::user();

    if($user->hasRole('admin')){
        $net = Network::query();
    }

    else if($user->hasRole('distributor')){
        $net = Network::whereHas('users', function($q) use ($user){
            $q->whereHas('roles', function($r){
                $r->whereIn('name', ['admin', 'owner']);
            })->where('parent_id', $user->id);
        })->query();
    }

    else if($user->hasRole('agent') || $user->hasRole('owner'))
        $net = Network::whereHas('users', function($q) use ($user){
            $q->where('email', $user->email);
        })->query();

    $ids_ordered = null;

    if(isset($data['id']) && $data['id']){
        $ids_ordered = $data['id'];
        $net = $net->orderByRaw(DB::raw("FIELD(id, $ids_ordered) desc"))
            ->paginate(3);

    }

    if($user->hasRole('admin') || $user->hasRole('distributor') || $user->hasRole('owner'))
        $ownerView = true;

    else $ownerView = false;

    $net = $net->get();
    if(!empty($net))

    $networks = $net->mapWithKeys(function($network) use ($ownerView, $ids_ordered){

        $coinSold   = $this->userNetworkRepo->getcoinSold($network->owner()->id);
        $allocated  = $this->userNetworkRepo->getAllocatedNez($network->owner()->id);
        $open       = false;

        if($ids_ordered){
            $ids_ordered = explode(',', $ids_ordered);

            if(in_array($network->id, $ids_ordered))
                $open = true;
        }

        $hierarchy = [
            'owner'             => $network->owner(),
            'agents'            => $network->agents(),
            'drawAgents'        => $this->drawAgentTree($network->id, true),
            'ownercoinSold'     => $coinSold,
            'ownerAllocated'    => $allocated,
            'open'              => $open,
        ];

        if ($distributor = $network->distributor()) {
           $hierarchy['distributor'] = $distributor;
        }

        $hierarchy['coinSold'] = [
            'ownerView'     => $ownerView
        ];

        return [$network->name => $hierarchy];

        //return [$network->distributor() ? $network->distributor()->getFullName() : 'no-partner' => $hierarchy];

    });

    if($request->ajax()){
        $view = view('admin.networks.partials.displayNetworkIndex', compact('networks'))->render();
        return response()->json(['html' => utf8_encode($view)],  200, ['Content-type'=> 'application/json; charset=utf-8'], JSON_UNESCAPED_UNICODE);
    }

    return view('admin.networks.index', compact('networks'));
}
但当我访问这个页面时,我得到了以下错误

方法\Database\Query\Builder::Query不存在

为什么会出现这种错误?这个查询哪里出了问题


我在google上搜索了一些关于它的线程,但是那些关于
keyBy

的线程当你开始查询时,你可以像现在一样从模型中静态调用
query()
,但是稍后当你添加
where
条件时,你不需要调用
query()
,因为它会返回查询实例,所以基本上删除您的
query()
调用,它的工作方式如下:

public function index(Request $request)
{

    $data = $request->validate([
        'id' => 'sometimes|nullable|string|max:10',
    ]);


    $networks = [];

    $user   = Auth::user();

    if($user->hasRole('admin')){
        $net = Network::query();
    }

    else if($user->hasRole('distributor')){
        $net = Network::whereHas('users', function($q) use ($user){
            $q->whereHas('roles', function($r){
                $r->whereIn('name', ['admin', 'owner']);
            })->where('parent_id', $user->id);
        });
    }

    else if($user->hasRole('agent') || $user->hasRole('owner'))
        $net = Network::whereHas('users', function($q) use ($user){
            $q->where('email', $user->email);
        });

    $ids_ordered = null;

    if(isset($data['id']) && $data['id']){
        $ids_ordered = $data['id'];
        $net = $net->orderByRaw(DB::raw("FIELD(id, $ids_ordered) desc"))
            ->paginate(3);

    }

    if($user->hasRole('admin') || $user->hasRole('distributor') || $user->hasRole('owner'))
        $ownerView = true;

    else $ownerView = false;

    $net = $net->get();
    if(!empty($net))

    $networks = $net->mapWithKeys(function($network) use ($ownerView, $ids_ordered){

        $coinSold   = $this->userNetworkRepo->getcoinSold($network->owner()->id);
        $allocated  = $this->userNetworkRepo->getAllocatedNez($network->owner()->id);
        $open       = false;

        if($ids_ordered){
            $ids_ordered = explode(',', $ids_ordered);

            if(in_array($network->id, $ids_ordered))
                $open = true;
        }

        $hierarchy = [
            'owner'             => $network->owner(),
            'agents'            => $network->agents(),
            'drawAgents'        => $this->drawAgentTree($network->id, true),
            'ownercoinSold'     => $coinSold,
            'ownerAllocated'    => $allocated,
            'open'              => $open,
        ];

        if ($distributor = $network->distributor()) {
           $hierarchy['distributor'] = $distributor;
        }

        $hierarchy['coinSold'] = [
            'ownerView'     => $ownerView
        ];

        return [$network->name => $hierarchy];

        //return [$network->distributor() ? $network->distributor()->getFullName() : 'no-partner' => $hierarchy];

    });

    if($request->ajax()){
        $view = view('admin.networks.partials.displayNetworkIndex', compact('networks'))->render();
        return response()->json(['html' => utf8_encode($view)],  200, ['Content-type'=> 'application/json; charset=utf-8'], JSON_UNESCAPED_UNICODE);
    }

    return view('admin.networks.index', compact('networks'));
}

您不能在
lighting\Database\query\Builder
上调用
query()。这是因为您正在调用where/wherehas,然后再次对其调用
query()

只需将其更新为:

if($user->hasRole('admin')){
        $net = Network::query();
    }

    else if($user->hasRole('distributor')){
        $net = Network::whereHas('users', function($q) use ($user){
            $q->whereHas('roles', function($r){
                $r->whereIn('name', ['admin', 'owner']);
            })->where('parent_id', $user->id);
        });
    }

    else if($user->hasRole('agent') || $user->hasRole('owner'))
        $net = Network::whereHas('users', function($q) use ($user){
            $q->where('email', $user->email);
        });
此外,为了调试这些问题,您可以使用
php artisan tinker
,并且您可以随意处理方法“query”仅在您已经调用其中一个get results方法(get、first、all等)或静态调用它时才起作用。请尝试改用getQuery方法:

if($user->hasRole('admin')){
    $net = Network::query();
}

else if($user->hasRole('distributor')){
    $net = Network::whereHas('users', function($q) use ($user){
        $q->whereHas('roles', function($r){
            $r->whereIn('name', ['admin', 'owner']);
        })->where('parent_id', $user->id);
    })->getQuery();
}

else if($user->hasRole('agent') || $user->hasRole('owner'))
$net = Network::whereHas('users', function($q) use ($user){
    $q->where('email', $user->email);
})->getQuery();

是否在文件/控制器的顶部执行“使用网络?”@cmac您指的是
use App\Network?是的,你包括你的模型吗?@cmac是的,在我的控制器中,我包括模型
使用App\Network你需要做“使用DB”;如果你想使用DB,我刚才注意到你是。