Imran Abbas
Imran Abbas

Reputation: 805

Why there is error Builder::query does not exist in laravel?

In index function I have query, based on roles and id the query getting change.

Following is script in my controller in index method

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'));
}

But when I access page I am getting following error

Method Illuminate\Database\Query\Builder::query does not exist.

why this error showing? Where is something wrong with this query?

I have searched about it on google and found some threads but those about keyBy.

Upvotes: 0

Views: 1612

Answers (3)

Andrew Zubets
Andrew Zubets

Reputation: 71

Method "query" only works when you already called one of get results methods (get, first, all etc.) or it was called statically. Try to use getQuery method instead:

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();

Upvotes: 0

Mihir Bhende
Mihir Bhende

Reputation: 9055

You can not call query() on Illuminate\Database\Query\Builder. It's happening because you are calling where/wherehas and then calling query() on it again.

Just simply update it to :

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);
        });

Further more to debug such issues, you can use php artisan tinker and you can fiddle around

Upvotes: 1

Abhay Maurya
Abhay Maurya

Reputation: 12277

When you start the query, you call query() statically from the model as you are doing but later on when you add where conditions, you don't need to call query() on that as it anyway returns the query instance so basically remove your query() calls and it will work like so:

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'));
}

Upvotes: 0

Related Questions