【问题标题】:Laravel - url parameters after?Laravel - url参数之后?
【发布时间】:2019-02-24 00:46:43
【问题描述】:

在 Laravel 中,我希望能够通过 id 或名称搜索用户。

我有以下路线:

Route::get('/user/{id}', 'UserController@getUserById')->name('user_by_id');

在浏览器中是这样的:

http://localhost:8000/user/1

如您所见,从 url 无法确定传递的值是 id 还是 name。

所以,我要求的可能是? 符号之后的 url 参数。

我想要以下网址:

http://localhost:8000/user?id=1
http://localhost:8000/user?name=hans

但我从来没有发现有人提到这个问题。

这可能吗? 如果不是,或者不是最佳实践,如何正确处理?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    我不知道这是否是最佳做法,但这样的事情应该可以解决问题:

    public function getUserById($id)
    {  
        $user = User::where('id', $id)->orWhere('name', $id)->first();
    
        $data['user'] = $user;
    
        return view('...',  $data);
    }
    

    编辑,现在我知道是索引视图..您还可以执行以下操作:

    将您的路线更改为:

    Route::get('/user', 'UserController@getUserById')->name('user_by_id');
    

    现在你可以使用http://...user?id=1&name=someSome这样的路由

    我会更改函数名称,但这取决于你...

    public function getUserById()
    {
        $q = User::query();
    
        if($request->id){
            $q->where('id', $request->id);
        }
    
        if($request->name){
            $q->where('name', $request->name);
        }
    
        $data['users'] = $q->get();
    
        return view('...',  $data);
    }
    

    考虑到如果没有设置参数,这将返回所有内容

    【讨论】:

    • 快速提示,你可以用first()替换get()->first()get()返回一个你调用first()函数的集合,在查询上直接调用first()会改变实际的sql查询并且只获取第一个结果,这也是内存密集型的。
    • 谢谢,我想过这样的事情,但是如果多个数据库字段具有相同的值呢?你知道 - 如果我想改为按姓名或姓氏搜索。这将返回第一个用户,但数据库中会有多个结果...
    • 这是什么视图,列表/索引?还是数据/显示视图?
    • 如果这是一个“显示”视图,我不会使用这种方法,我会一直使用 ID...但如果这是某种索引,您可以使用 get() ...
    • 我希望数据在 html 表中,所以仍然会呈现多个结果,但我只是想知道最佳实践。
    【解决方案2】:

    您可以创建一条路径,在其中获取 id 变量并在 id 和 name 上执行 where 子句。

    public function getUserById(Request $request, $id){
        $users = User::where('name', $id)->orWhere('id', $id')->get();
    }
    

    如果要使用url参数也可以使用$request->input()函数。

    http://localhost:8000/user?id=1&name=milo
    
    public function getUserById(Request $request){
        $id = $request->input('id');
        $name = $request->input('name');
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 2017-03-04
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2020-08-09
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多