控制Eloquent作用域的运行顺序



我有一个简单的雄辩作用域,我想总是在所有其他"Where"之后运行。语句在最后的查询中优化查询的效率。我希望它最后运行,无论我把它放在查询生成器的哪里(这是一个大型应用程序,这个范围已经使用了很多次,我希望它在未来是万无一失的)

我将把作用域放在下面,但它与Eloquent文档中的示例完全相同。

public function scopeActive($query)
{
$query->where('active', 1);
}

我知道eloquent很聪明,它把排序语句放在Where语句之后,所以也许有一个技巧可以使用这个逻辑来操纵Where语句的顺序,但到目前为止我还看不出来。如果有可以运行的原始sql,我会使用MySQL。

SELECT ...
WHERE foo > 123
AND active = 1

将[可能]运行更快如果你有

INDEX(active, foo)

注意,无论active=1WHERE子句中的位置如何,将active_first放在in theINDEX '是最优的。

我的观点是"总是追着其他地方跑"。并不是我们想要达到的目标。所以…

我不知道Eloquent是否可以"自动"添加这样的语句,但也许我们可以在MySQL中实现相同的目标。(有上百个框架试图对用户隐藏MySQL。我不可能全部学会;相反,我试图帮助用户解决框架的缺陷。框架用户需要学习框架底层数据库)

  • TABLE之上创建VIEW,其中VIEW:SELECT * FROM tbl WHERE active = 1。然后告诉Eloquent访问那个View而不是底层的Table。(我怀疑框架的语法是相同的。)
  • active,添加到表的大多数索引开头(视图不能作为索引)

如果您需要进一步讨论这个问题(无论是在进行此类更改之前还是之后),请提供SHOW CREATE TABLEEXPLAIN SELECT...。可能还有其他问题使我的建议不如我希望的那么好。

相关内容

  • 没有找到相关文章

最新更新