检索与laravel模型查询匹配的条件

时间:2018-03-28 17:59:08

标签: mysql laravel search

这可能是一个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属性与您的匹配搜索critera。"其中x是使其匹配的条件。

上面的代码返回匹配的记录集合。 我想知道这些记录的匹配位置。

2 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你只需要展示你的模型并说出你正在看到这个因为......"。如果情况确实如此,并且模型在查询完成时可能只有位置,分支或位置,那么您可以在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);

应该返回一个数组。

通过这种方式,该方法返回的内容将通过查看数组中的值来告诉您对象的匹配方式。

希望这有帮助!

答案 1 :(得分:0)

现在您的查询如下所示:

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实现,以找到从关系中生成这些子查询的方法。