【问题标题】:Search in all columns in a eloquent model在 eloquent 模型中的所有列中搜索
【发布时间】:2021-05-13 13:52:44
【问题描述】:

在遵循一些 SO 问题(123)之后,我能够创建以下代码:

$search = 'Project 1';
$columns = ['id', 'name', 'key'];

$projects = Project::where('tenant_id', 1)->select($columns);

foreach ($columns as $column) {
    $projects = $projects->orWhere($column, 'LIKE', "%{$search}%");
}
dd($projects->get());

但是,上面的代码在模型中返回所有结果,而不是仅返回与 $search 变量匹配的结果。我做错了什么?

【问题讨论】:

  • 如果您执行dd($projects->toSql());(而不是->get()),您可以看到正在执行的基本SQL。您可能有范围问题,WHERE ... OR ... OR ... 而不是 WHERE ... AND (WHERE ... OR ... OR ...)
  • @TimLewis 是的,在这个问题之前我已经注意到了,但是找不到任何方法来修复 eloquent 查询的范围。我该怎么做?
  • 这实际上很容易,但在文档中很难找到。我会为你添加一个快速的答案:)

标签: laravel


【解决方案1】:

这可能是一个范围问题,您需要一个嵌套的where() 子句来处理这个问题:

$search = 'Project 1';
$columns = ['id', 'name', 'key'];

$projects = Project::where('tenant_id', 1)
->where(function ($subQuery) use ($columns, $search){ 
  foreach ($columns as $column) {
    $subQuery = $subQuery->orWhere($column, 'LIKE', "%{$search}%");
  }
  return $subQuery;
})->select($columns)->get();

注意:如果更适合您的需要,可以将初始 ->where() 调整为 ->orWhere()

使用->where|orWhere(function(){ ... }) 允许您确定 where 逻辑的范围,以避免与其他条件发生冲突/歧义。

【讨论】:

  • 完美运行,非常感谢您的帮助!
  • 太棒了!乐于助人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2021-01-03
  • 2020-01-22
  • 2017-11-23
  • 2019-01-01
相关资源
最近更新 更多