【问题标题】:How to optimize the following query Laravel?如何优化以下查询 Laravel?
【发布时间】:2020-08-02 13:43:48
【问题描述】:

我的代码运行良好。

 $amenityCategoryMapping1 = AmenityCategoryMapping::where('property_id', $property->id)
    ->orderBy('amenity_name','asc')
    ->orderBy('updated_at','desc')
    ->pluck('category_id', 'amenity_name')->toArray();

$amenityCategoryMapping2 = AmenityCategoryMapping::where('company_id', $property->company_id)
    ->orderBy('amenity_name','asc')
    ->orderBy('updated_at','desc')
    ->pluck('category_id', 'amenity_name')->toArray();

$amenityCategoryMapping3 = AmenityCategoryMapping::whereNull('property_id')
    ->orderBy('amenity_name','asc')
    ->orderBy('updated_at','desc')
    ->pluck('category_id', 'amenity_name')->toArray();

$amenityCategoryMapping = array_merge($amenityCategoryMapping3, $amenityCategoryMapping2, $amenityCategoryMapping1 );

但是,目前我正在执行 3 个不同的查询,以仅使用不同的参数从同一个表中提取数据。有什么方法可以最小化这个查询请求并且仍然收到相同的结果?

目前,如果两个数组具有相同的键,那么我将用amenityCategoryMapping2 替换amenityCategoryMapping3amenityCategoryMapping1。那应该优先考虑amenityCategoryMapping1

【问题讨论】:

  • 合并数组的顺序重要吗?
  • @user3532758 是
  • 你也许可以使用union,从1和2中删除plucktoArray方法,然后在2上使用union合并1,然后在3上合并2。使用采摘最后一个。那应该处理重复项。但是,请在放弃当前方法之前分析性能。根据您的数据集和内存限制,联合可能更快或更慢。

标签: laravel laravel-5.8


【解决方案1】:

尝试使用orWhere函数


$amenityCategoryMapping1 = AmenityCategoryMapping::where('property_id', $property->id)
    ->orWhere('company_id', $property->company_id)
    ->orWhereNull('property_id')
    ->orderBy('amenity_name','asc')
    ->orderBy('updated_at','desc')
    ->pluck('category_id', 'amenity_name')->toArray();

【讨论】:

  • 对不起,由于数组合并的顺序,它不起作用。在这种情况下,具有最新 updated_at 值的键将替换所有其他数据。但是,明确提到的数据来自 property_id > company_id > null (property_id)。这违反了问题中的 array_merge 概念。
  • 我认为没有必要合并数组,因为所有数据都来了。尝试删除 toArray 函数并添加 get function()
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2021-05-04
相关资源
最近更新 更多