首页 > 解决方案 > 在 Laravel 中对一个函数执行两个操作,可能吗?

问题描述

我的应用程序中有 2 个用户角色,管理员前任

管理员可以创建多个模型...

在此处输入图像描述

如果,我将我与 ID 1 联系起来?我检索前者的信息。

在此处输入图像描述

所以,我的函数 index() 允许检索用户的 id

public function index()
{   
    if($has_role = auth()->user()->hasRole('admin')){
        $formers = Former::first()->paginate(5);
        return view('admin.formers.index', compact('formers'));
    } else{
        $formers = Former::where('email', Auth::user()->email)->paginate(5);
        return view('admin.formers.index', compact('formers'));
    }
}

好吧,对于用户admin,我想创建一个搜索栏...

在此处输入图像描述

我在函数 index()之前创建了它并且有效

public function index(Request $req)
{
    if ($req->search == "") {
        $formers = Former::paginate(5);
        return view('admin.formers.index', compact('formers'));
    } else {
        $validated = $req->validate([
            'search' => 'alpha', 
        ]);

        $formers = Former::where('nom', 'LIKE', '%' . $validated['search'] . '%')->paginate(5);
        $formers->appends($req->only('search'));
        return view('admin.formers.index', compact('formers'));
    }
}

现在,我想在一个函数中调整我的两个动作,你可以吗?

您认为我可以获取user_id并在同一功能中制作搜索栏吗?

谢谢

标签: laravellaravel-5

解决方案


我会做的是以下几点:

  • 添加一个为两个角色提供数据的操作。
  • 仅向管理员显示搜索,但在服务器端忽略这一事实,因为从安全角度来看,非管理员是否可以搜索并不重要。无论如何,他们仅限于他们的结果。

基本上,这可以通过以下方式实现:

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;

public function index(Request $request)
{   
    $user = $request->user();

    $formers = Former::query()
        ->when($user->hasRole('admin') !== true, function (Builder $query) use ($user) {
            $query->where('email', $user->email);
        })
        ->when($request->has('s'), function (Builder $query) use ($request) {
            $query->where('nom', 'like', '%'.$request->input('s').'%');
        })
        ->paginate(5);

    return view('admin.formers.index', compact('formers'))
        ->with('display_search', $user->hasRole('admin'));
}

然后,您可以在视图中简单地使用$display_search变量来决定是否要显示搜索:

@if($display_search)
  <form method="post" action="...">
    <input type="text" name="s" placeholder="Type to search...">
  </form>
@endif

推荐阅读