【问题标题】:Get highest & lowest data based on a whereHas query根据 whereHas 查询获取最高和最低数据
【发布时间】:2017-06-15 08:20:49
【问题描述】:

基于apartment finder 所有types 具有apartments,基于表单搜索正在显示/返回。这是使用whereHas 查询完成的。

例如:

用户有不同的选择;花园/阳台,价格范围,楼层 等等

正在根据这些选择运行查询,如果有 满足搜索要求的公寓 父母 公寓(类型)正在被退回。

最终我想显示一个类型的living surface 范围(lowest-highest),但是每个apartmentliving surface 是不同的。

获取highest lowest apartment.living_surfacewhereHas 返回的最有效方法是什么。

$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-&gt;view 中包含的任何内容的值添加到 where 子句。我的 PHP 有点生疏了,我可能会遗漏一些东西,但无论用户选择什么,它似乎都会导致完全相同的结果。
  • 不过,要回答您的问题,您可能希望使用 MIN 和 MAX 语句来获取 living_surface,并在类型上使用 GROUP BY。但是,在不了解您的数据模型的情况下,很难准确地说出该怎么做。
  • @SchmitzIT 好消息,我可以更改前三个并检查数据是否已设置,然后使用 $request->view 运行查询,并为后一个注释;这可以在同一个查询中完成吗?
  • 这完全取决于您的查询当前的样子。我们在这里看到的只是一些 PHP 代码,但与它正在构建的查询无关。这应该是可能的,但这取决于那里已经存在的任何内容,这可能会影响查询的其余部分。

标签: mysql sql laravel laravel-5.3


【解决方案1】:

这可以通过Collection Methods - Laravel Docs 来完成

可以在查询的集合上运行方法 - 在本例中为 $types

foreach ($types as $type) {
    $type->lowest_living_area = $type->apartments>sortBy('living_area')->first()->living_area);
    $type->highest_living_area = $type->apartments->sortBy('living_area')->last()->living_area);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2018-08-21
    • 1970-01-01
    • 2018-10-03
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多