简体   繁体   中英

Laravel troubles with WHERE in relationships

I'm having trouble when a user is not an admin . The goal is to get only those requests that belong to the user, but when I use the where clause, I get all the requests from the DB. It was supposed to get all the requests only for an admin .

Thank you for the help!

public function index(){
    $status = request('status', -1);
    $paper_size = request('paper_size', -1);

    if (auth()->user()->isAdmin()) {
        $requests = Request::
            where('paper_size', $paper_size)->orWhereRaw($paper_size. ' = -1')->
            where('status', $status)->orWhereRaw($status. ' = -1')->


            orderBy(
                request('orderby') ? request('orderby') : 'created_at',
                request('order') ? request('order') : 'DESC'
            )->paginate(10);

        $departments = Departament::All();


        return view('Requests.index', compact('requests', 'departments'));
    }

    $requests = auth()->user()->requests()->
        where('status', $status)->orWhereRaw($status. ' = -1')->
        where('paper_size', $paper_size)->orWhereRaw($paper_size. ' = -1')->
        orderBy(
            request('orderby') ? request('orderby') : 'created_at',
            request('order') ? request('order') : 'DESC'
        )->paginate(10);

        return view('Requests.index', compact('requests'));
}

UPDATE:

I can already list all user requests, but the status filter does not work.

Ps: the filter "paper_size" is working as expected

SOLVED:

Thanks to the whole community, and especially to @Sandeesh

    public function index(){
    request('status') == -1 || request('status') == null ?
        $statusExists = false : $statusExists = true;
    $status = request('status');

    request('paper_size') == -1 || request('paper_size') == null ?
        $paper_sizeExists = false : $paper_sizeExists = true;
    $paper_size = request('paper_size');

    $is_admin = auth()->user()->isAdmin();

    $requests = Request::when($statusExists, function ($query) use ($status) {
        return $query->where('status', $status);
    })
        ->when($paper_sizeExists, function ($query) use ($paper_size) {
            return $query->where('paper_size', $paper_size);
        })
        ->when(!$is_admin, function ($query) {
            return $query->where('owner_id', auth()->id());
        })
        ->orderBy(request('orderby', 'created_at'), request('order', 'desc'))
        ->paginate(10);

    if (!$is_admin) {
        return view('Requests.index', compact('requests'));
    }

    $departments = Departament::all();

    return view('Requests.index', compact('requests', 'departments'));
}

Wrap your where and orWhereRaw conditions together for a single column. Or use when instead of the workaround you apply with -1 = -1 . I've also refactored the code for you.

public function index()
{
    $status = request('status');
    $paper_size = request('paper_size');

    $is_admin = auth()->user()->isAdmin();

    $requests = Request::when(!is_null($status), function ($query) use ($status) {
            return $query->where('status', $status);
        })
        ->when(!is_null($paper_size), function ($query) use ($paper_size) {
            return $query->where('paper_size', $paper_size);
        })
        ->when(!$is_admin, function ($query) {
            return $query->where('owner_id', auth()->id());
        })
        ->orderBy(request('orderby', 'created_at'), request('order', 'desc'))
        ->paginate(10);

    if (!$is_admin) {
        return view('Requests.index', compact('requests'));
    }

    $departments = Departament::all();

    return view('Requests.index', compact('requests', 'departments'));
}

您将需要获取$user_id = Auth::id ,然后更新第二个查询以具有where user_id = $user_id语句(我不确定那些表中的哪个属于用户)。

Try with:

$requests = Request::with('User')
    ->where('user_id',\Auth::user()->user_id)
    ->where('status', $status)
    ->orWhereRaw($status. ' = -1')
    ->where('paper_size', $paper_size)
    ->orWhereRaw($paper_size. ' = -1')
    ->orderBy(request('orderby') ? request('orderby') : 'created_at',
              request('order') ? request('order') : 'DESC')->paginate(10);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM