这可能是一个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是使其匹配的条件。
上面的代码返回匹配的记录集合。 我想知道这些记录的匹配位置。
答案 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
实现,以找到从关系中生成这些子查询的方法。