【问题标题】:Laravel Eager Loading Results Not Fiultering, Also Returning NullLaravel 渴望加载结果不过滤,也返回 Null
【发布时间】:2020-07-13 23:09:31
【问题描述】:

我正在编写一个 Eloquent 查询。条件如下:

  1. 有四个表:
    1. 表1:medicare_advantage_table
    2. 表 2:medicare_advantage_plan_table
    3. 表 3:medicare_advantage_features_table
    4. 表 4:medicare_advantage_company_table
  2. 表 1 通过 medicare_advantage_features_pivot 表与表 3 具有 ManyToMany 关系
  3. 表 1 与表 2 有 ManyToOne 关系
  4. 表 1 与表 4 有 ManyToOne 关系

现在我想查询来自medicare_advantage_table 提供的medicare_advantage_plan_idmedicare_advantage_company_idmedicare_advantage_features_id 的所有记录作为数组。我写了这个雄辩的查询。它正在从medicare_advantage_table 获取所有记录,而无需从其他三个表中进行限制和选择,如下所示:

Result Set Image

我在这里做错了什么?任何帮助将不胜感激

final public function getMedicarePolicies(Request $request): JsonResponse
{
    $data = MedicareAdvantage::with([
        'features' => static function (BelongsToMany $query) use ($request) {
            $query->select('id', 'feature_name')->whereIn('id', $request->input('features') ?? []);
        },
        'company' => static function (BelongsTo $query) use ($request) {
            $query->select('id', 'company_logo', 'company_name')->whereIn('id', $request->input('companies') ?? []);
        },
        'medicareAdvantagePlan' => static function (BelongsTo $query) use ($request) {
            $query->select('id', 'medicare_advantage_plan_type')->whereIn('id', $request->input('plans') ?? []);
        }
    ])->select('id', 'name', 'monthly_premium', 'primary_doctor_co_pay', 'specialist_co_pay', 'company_id')->get();
    return response()->json($data, 200);
}

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    实际上,我还是设法解决了这个问题。这是解决方案:

    $data = MedicareAdvantage::with('features', 'medicareAdvantagePlan', 'company')
        ->whereHas('features', static function (Builder $query) use ($request) {
            $query->select('id', 'feature_name')->where(static function (Builder $query) use ($request) {
                if ($request->input('features') !== null) {
                    $query->whereIn('id', $request->input('features'));
                }
            });
        })
        ->whereHas('medicareAdvantagePlan', static function (Builder $query) use ($request) {
            $query->select('id', 'medicare_advantage_plan_type')->where(static function (Builder $query) use ($request) {
                if ($request->input('plans') !== null) {
                    $query->whereIn('id', $request->input('plans'));
                }
            });
        })
        ->whereHas('company', static function (Builder $query) use ($request) {
            $query->select('id', 'company_name', 'company_logo')->where(static function (Builder $query) use ($request) {
                if ($request->input('companies') !== null) {
                    $query->whereIn('id', $request->input('companies'));
                }
            });
        })
        ->select('id', 'name', 'monthly_premium', 'primary_doctor_co_pay', 'specialist_co_pay')->get();
    

    【讨论】:

    • 可能会添加范围以简化这些类型的查询。
    • 这些是什么吃的? :)
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多