Laravel模型:来自外部数据库的复杂查询?

时间:2018-02-04 18:35:12

标签: sql laravel laravel-5 eloquent

Laravel的新手,善待。 :-)

我有一个外部只读遗留数据库。 我使用复杂的查询来检索" 顶级产品"从Products表中。 这是一个昂贵的查询,应该缓存(如有必要,每天只更新一次)。查询的参数:自日期xyz以来的最高产品,最大结果数量(默认值:500)。

数据库完全是只读的。无法创建视图(solution to a similar question)。

我希望能够将这些顶级产品视为Laravel的常规型号。 这样我就可以应用关系/过滤器了。例如。检查购买顶级产品的购买模式"获取"顶级产品"具有供应商价值" xyz"。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

运行这样的查询的最有效方法通常是在存储过程中运行它。您可以在迁移中定义存储过程,以确保它在数据库中定义并使用以下内容运行它:

DB::select('exec my_stored_procedure(?,?)', [$a, $b]);

然而,我的理解是,这不会与Eloquent(我以前没有机会尝试这种方法)相配。您可以通过将响应包装在collect()中来将响应转换为集合,这可能有所帮助,但这意味着在PHP中进行排序和过滤,这在SQL中的效果总是低于。

或者,您可以使用Eloquent重写整个事物并将其作为模型上的方法。

如果需要在SQL中进一步优化此查询,那么这样做的方法是在约束查询的模型上定义local scope,如下例所示:

public function scopeTopProducts($query)
{
    return $query->where('a', true);
}

然后你可以安全地调用MyModel::topProducts()->find(1),因为知道范围会限制查询集。

可以使用Laravel's caching system缓存回复。但是,对于后一种方法,您无法缓存范围,只能缓存最终查询的结果。如果这可能会导致问题,那么最好只使用可以缓存的单个查询填充初始数据,并使用Laravel's collections进一步过滤数据而不是SQL。