【发布时间】:2017-06-15 08:20:49
【问题描述】:
基于apartment finder 所有types 具有apartments,基于表单搜索正在显示/返回。这是使用whereHas 查询完成的。
例如:
用户有不同的选择;花园/阳台,价格范围,楼层 等等
正在根据这些选择运行查询,如果有 满足搜索要求的公寓 父母 公寓(类型)正在被退回。
最终我想显示一个类型的living surface 范围(lowest-highest),但是每个apartment 的living surface 是不同的。
获取highest 和 lowest apartment.living_surface 被whereHas 返回的最有效方法是什么。
$types = Type::where('type', '=', 'studio')->whereHas('apartments', function ($query) use ($request) {
if ($request->view == 'garden') {
$query->where('view', '=', $request->view);
} elseif ($request->view == 'balcony') {
$query->where('view', '=', $request->view);
} elseif ($request->view == 'other') {
$query->where('view', '=', $request->view);
}
if ($request->floor == 'upper') {
$query->where('floor', '<', '5');
} elseif ($request->floor == 'lower') {
$query->where('floor', '>', '4');
}
if ($request->sun == 'morning') {
$query->where('sun', '=', 'morning');
} elseif ($request->sun == 'evening') {
$query->where('sun', '=', 'evening');
}
if ($request->price == '1') {
$query->where('price', '<', '900');
} elseif ($request->price == '2') {
$query->where('price', '<', '999');
} elseif ($request->price == '3') {
$query->where('price', '>', '999');
}
})->with('apartments')->get();
一种解决方案是(我认为)是从apartments 中提取所有ids 并基于ids 运行另一个查询,但是由于运行多个查询,这实际上不会尽可能优化(我希望)在一个查询中完成。
【问题讨论】:
-
前三个 where 有什么意义?关于选择的最终结果是将
request->view中包含的任何内容的值添加到 where 子句。我的 PHP 有点生疏了,我可能会遗漏一些东西,但无论用户选择什么,它似乎都会导致完全相同的结果。 -
不过,要回答您的问题,您可能希望使用 MIN 和 MAX 语句来获取 living_surface,并在类型上使用 GROUP BY。但是,在不了解您的数据模型的情况下,很难准确地说出该怎么做。
-
@SchmitzIT 好消息,我可以更改前三个并检查数据是否已设置,然后使用 $request->view 运行查询,并为后一个注释;这可以在同一个查询中完成吗?
-
这完全取决于您的查询当前的样子。我们在这里看到的只是一些 PHP 代码,但与它正在构建的查询无关。这应该是可能的,但这取决于那里已经存在的任何内容,这可能会影响查询的其余部分。
标签: mysql sql laravel laravel-5.3