Laravel 关系搜索

Posted

技术标签:

【中文标题】Laravel 关系搜索【英文标题】:Laravel Relationship Search 【发布时间】:2021-08-03 13:11:24 【问题描述】:

我正在使用 Laravel 8 构建一个项目。我需要处理包含 page、limit、searchColumn、searchText、orderColumn 和 orderDirection 的请求参数。有时我需要在关系中搜索。我在下面构建了这个系统,但它不适用于关系。

        $query = (new Log())->newQuery();
        $query->with('customer', 'domain', 'type');

        if ($request->searchColumn != "" && $request->searchColumn != NULL) 
            $query->where($request->searchColumn, 'LIKE', '%' . $request->searchText . '%');
        

        if ($request->orderColumn != "" && $request->orderColumn != NULL) 
            $query->orderBy($request->orderColumn, $request->orderDirection);;
        

        $logs = $query->paginate($request->limit, ['*'], '', $request->page);

例如,如果$request->searchColumn 是'customer.name',我应该如何搜索?我尝试了几种方法,但它们都不起作用。

【问题讨论】:

约束急切加载有帮助吗?它在关系模型上添加了一个约束。 laravel.com/docs/7.x/… 我应该在第二行删除'with'吗? 【参考方案1】:

您可以使用whereHas 方法,该方法允许在您的关系上定义额外的查询约束。例如:

$searchText = $request->searchText;
if ( explode( '.', $request->searchColumn )[0] == 'customer' ) 
    $query->whereHas( 'customer', function( $query ) use ( $searchText ) 
         $query->where( 'name', 'LIKE', '%' . $searchText . '%' )
    );

【讨论】:

我应该删除第二行中的'with'吗?

以上是关于Laravel 关系搜索的主要内容,如果未能解决你的问题,请参考以下文章

在最近的关系记录中搜索 - Laravel (Eloquent)

Laravel 数据表搜索嵌套关系

Laravel - 搜索关系,包括 whereHas 中的 null

Laravel 多对多关系搜索

在 laravel 中搜索表及其关系

Laravel:数据表搜索选项不使用关系表字段