Почему возникает ошибка Builder :: query не существует в laravel? - PullRequest
0 голосов
/ 13 февраля 2019

В индексной функции у меня есть запрос, основанный на ролях и идентификаторе запроса, получающего изменение.

Ниже приведен скрипт в моем контроллере в методе индекса

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

Но когда я захожу на страницу, я получаю следующую ошибку

Метод Illuminate \ Database \ Query \Builder :: query не существует.

почему эта ошибка отображается?Где что-то не так с этим запросом?

Я искал об этом в Google и нашел несколько тем, но о keyBy.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Нельзя звонить query() на Illuminate\Database\Query\Builder.Это происходит потому, что вы звоните куда / куда и затем снова вызываете 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 и вы можете поиграть

0 голосов
/ 13 февраля 2019

Метод «запрос» работает только тогда, когда вы уже вызвали один из методов получения результатов (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();
0 голосов
/ 13 февраля 2019

Когда вы запускаете запрос, вы вызываете query() статически из модели, как вы делаете, но позже, когда вы добавляете where условия, вам не нужно вызывать query() для этого, так как он в любом случае возвращаетЭкземпляр запроса, поэтому в основном удалите ваши query() звонки, и он будет работать так:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...