Laravel Eloquent:如果搜索文本字段为空,如何显示所有行

Posted

技术标签:

【中文标题】Laravel Eloquent:如果搜索文本字段为空,如何显示所有行【英文标题】:Laravel Eloquent: how to display all rows if search text field is empty 【发布时间】:2021-10-05 00:18:49 【问题描述】:

如果有值先演示一下:

文本字段:

<input type="text" id="search_category" class="search_category" placeholder="Search by Category" value="a">

Ajax 函数:(显示正在获取的文本字段中的数据)

var search_category = $('#search_category').val();
------------------------------------------
    $.ajax(
    type: "GET",
    url: "/clinical/bbr-category-configuration-data/"+search_category,

SQL 选择:

public function fetchcategory($search_category)
    $all_categories = HmsBbrCategory::query()
                                    ->when(empty($search_category), function ($query) 
                                        $query->where('category_id', '>=', '1');
                                    )
                                    //iLike is case insensitive
                                    ->when(!empty($search_category), function ($query) use ($search_category) 
                                        $query->where('category_name', 'iLIKE', "%$search_category%");
                                    )    
                                      ->orderBy('category_id', 'ASC')
                                      ->get(); 

由于我的文本字段有value="a",查询触发!empty(),显示:

我的问题是,如果我将文本字段更改为空白的 value="" 并触发 when(empty()),则行不显示,我收到错误

404 not found
"message": "",
"exception": "Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException",

如果我的文本字段为空,如何阻止此错误的发生?

总结:如果搜索值为空,则尝试输出所有行,现在出现 404 错误

更新:试过了,如果文本字段为空,我仍然无法搜索

    url: "/clinical/bbr-category-configuration-data/?search="+search_category,
    Route::get('/bbr-category-configuration-data/?search=search_category', [BBRCategoryConfigurationController::class,'fetchcategory']);

    $search_category = request('search');
    $all_categories = HmsBbrCategory::query()
                                    ->when(empty($search_category), function ($query) 
                                        $query->where('category_id', '>=', 1);
                                    )
                                    //iLike is case insensitive
                                    ->when(!empty($search_category), function ($query) use ($search_category) 
                                        $query->where('category_name', 'iLIKE', "%$search_category%");
                                    )    
                                      ->orderBy('category_id', 'ASC')
                                      ->get();

【问题讨论】:

【参考方案1】:

您需要拆分逻辑而不是链接when 方法,如下所示:

public function fetchcategory($search_category)
    $all_categories = HmsBbrCategory::query();
    if (empty($search_category)) 
        $all_categories->where("category_id", ">=", 1);
     else 
        $all_categories->where("category_name", "iLIKE", "%$search_category%");
    

    return $all_categories->orderBy("category_id"; "ASC")->get();

【讨论】:

【参考方案2】:

我认为发生 404 可能是因为您没有注册正确的路线/clinical/bbr-category-configuration-data。不要将 search_category 作为 url 路由传递,而是尝试像这样将其作为查询字符串传递。

/clinical/bbr-category-configuration-data/?search=" + search_category

然后您可以通过控制器内的请求助手获取此值

$search_category = request('search');

确保您在 web.php 或 api.php 文件中注册了正确的路由。

【讨论】:

试过了,空白时仍然无法搜索(尝试在路线中使用和不使用括号)【参考方案3】:

尝试删除 1 周围的引号。它现在被视为字符串,而不是整数。该行应该是:

$query->where('category_id', '>=', 1);

更新

您还应该更新您的路线,例如:

 Route::get('/bbr-category-configuration-data', [BBRCategoryConfigurationController::class,'fetchcategory']);

Ajax 函数:

var search_value = $('#search_category').val();

$.ajax(
    type: "GET",
    data:search_categoy:search_value,
    url: "/clinical/bbr-category-configuration-data/",

在你的方法中:

$search_category = request('search_category');

由于您声明路线的方式,您会收到 404。由于您已将“search_category”声明为您的路由参数,因此您将始终必须为其传递一个值。因此,它在为参数传递值时起作用。但是当参数保持为空时,它会抛出“404 Not found”错误。因为 Laravel 期待 search_category 参数的值,但找不到。

【讨论】:

问题仍然相同,但这可能是另一个修复。当我的主要问题得到解决时,这个错误很可能会出现。 问题出在你的路由配置上。我刚注意到。如果您这样声明您的路线,您将始终必须为 search_category 传递一个值。更好的解决方案是在路由器中声明不带查询参数的 url。之后您将不再获得 404。 我已经根据问题更新了我的答案并分享了解决问题的代码

以上是关于Laravel Eloquent:如果搜索文本字段为空,如何显示所有行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eloquent 在包含对象数组的 json 字段中进行搜索

Laravel Eloquent 搜索 JSON 数组以获取特定列的值

Laravel Eloquent ORM字段处理

Laravel Eloquent 比较日期时间字段中的日期

Laravel Eloquent:返回数组键作为字段 ID

仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录