Reputation: 805
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
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
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
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