【问题标题】:Retrieve conditions matched on laravel model query检索与 laravel 模型查询匹配的条件
【发布时间】:2018-09-07 12:51:21
【问题描述】:

这可能是一个 SQL 限制,但我正在处理一个 Laravel 项目,所以我提出问题来解决我想要完成的任务。

我正在搜索模型(及其关系)

Auth::user()->employers()
    ->where('name', 'like' $filter)
    ->orWhereHas('locations.location', function($query) use ($filter) {
        $query->where('name', 'like', $filter);
    })
    ->orWhereHas('locations.branches', function($query) use ($filter) {
        $query->where('name', 'like', $filter);
    })
    ->orWhereHas('locations.positions', function($query) use ($filter) {
        $query->where('name', 'like', $filter);
    })->get();

我希望能够确定哪些条件与记录匹配,以便我可以告诉前端,“嘿,这条记录正在显示给您,因为其中嵌套的 x 属性与您的搜索条件匹配。 "其中 x 是使其匹配的条件。

上面的代码返回匹配的记录集合。 我想知道这些记录中的每一个在哪里匹配。

【问题讨论】:

  • 我不明白这个问题
  • 好的,我想根据各种搜索条件进行搜索,它们都是可选的(WHERE location.name = 'Peter' OR 'location.branches' = 'Peter' OR 'location. cmets' = '彼得')。所以我想显示哪个搜索条件与我的数据库中的记录匹配。这有意义吗?
  • 那么你想要它怎么样?作为一个单独的列?
  • 我现在并不在乎,我主要是想尽一切办法做到这一点。

标签: mysql laravel search


【解决方案1】:

现在您的查询如下所示:

select *
from employees
where name like ?
  or exists (select * from locations ...)
  or exists (...)

当您将子查询添加到 SELECT 部分时,您会得到布尔值:

select *,
  exists (select * from locations ...) as hasLocations
  exists (...) as hasBranches
  ...
from employees
where name like ?
  or exists (select * from locations ...)
  or exists (...)

您必须查看whereHas 实现,才能找到从关系中生成这些子查询的方法。

【讨论】:

  • 您建议在选择级别进行检查,以解析为布尔值,我稍后可以检查它是真还是假?我会看看我能在 whereHas 中找到什么,谢谢
【解决方案2】:

如果我正确理解了您的问题,您只需展示您的模型并说“您看到这个是因为...”。如果确实是这种情况,并且模型在查询完成时可能只有一个位置、一个分支或一个位置,那么您可以简单地在 if 语句中查询它。假设您的“搜索”标准是$name

$matches = array();

if($user->location == $name) {
  array_push($matches, 'location');
};
if($user->branch == $name) {
  array_push($matches, 'branch');
};
if($user->position == $name) {
  array_push($matches, 'position');
};

return $matches;

您基本上已经完成了查询,现在只需检查参数满足您条件的对象。如果有多个硬条件,尽管我会寻找一种更面向对象的方法,但在这种情况下,对象上的简单过程方法就可以了。可以在 User 模型上执行此操作,如果有多个匹配值,则返回一个数组:

public function foundBy($name) {

    $matches = array();

    if($this->location == $name) {
      array_push($matches, 'location');
    };
    if($this->branch == $name) {
      array_push($matches, 'branch');
    };
    if($this->position == $name) {
      array_push($matches, 'position');
    };
    return $matches;

}

这样称呼它:

$foundBy = $user->foundBy($name);

并且应该返回一个数组。

这样,方法返回的内容将通过查看数组中的值告诉你对象如何匹配。

希望这有帮助!

【讨论】:

  • 如果包含两个或更多呢?喜欢位置和分支?
  • 我不确定我是否在关注,所以如果我明白了,请告诉我。我认为在您的回复的第一部分中,您正在谈论遍历我的查询的响应并检查每个节点以查看其匹配的位置。第二部分您建议对正在搜索的模型之一进行更改,以便模型本身可以告诉您它是如何匹配的? PS。所有的关系都是一对多的。所以雇主会有很多地点等等。
  • 如果两个或更多,您可以简单地拥有一个数组并将其附加到每个匹配的值,然后返回该数组。
  • @Pablo 您的第一部分是正确的,您只是在检查哪个属性与名称匹配。对于第二部分,主要是在那里。在这种情况下,您使用的模型是 User 模型,因为 Auth::user() 会为当前授权用户返回它的一个实例。通过将我的方法添加到 User 模型中,每次实例化用户对象时,您将能够检查它是否具有匹配的参数。
  • 谢谢@Luke,我会试试看能不能用上。
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 2018-11-14
  • 2018-11-04
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多