laravel 控制Eloquent示波器的运行顺序

oxcyiej7  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(93)

我有一个简单的Eloquent作用域,我希望它总是在最终查询中的所有其他“Where”语句之后运行,以优化查询的效率。我希望它最后运行,无论我把它放在查询构建器中的什么位置(它用于一个大型应用程序,在那里这个作用域已经被多次使用,我希望它在将来是傻瓜式的)
我将把范围放在下面,但它与Eloquent文档中的示例完全相同。

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

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

alen0pnh

alen0pnh1#

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

如果你有,我[可能]会跑得更快

INDEX(active, foo)

请注意,无论active=1WHERE子句中的位置如何,将active_first in the INDEX '放在前面都是最佳的。
我想说的是“总是追求别人的目标”并不是一个正确的目标。所以...
我不知道Eloquent是否可以“自动”添加这样的语句,但也许我们可以在MySQL中实现同样的目标。(有上百个框架试图向用户隐藏MySQL,我无法全部学会;相反,我试图帮助用户解决框架的缺陷。2框架用户需要学习框架和底层数据库。

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

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

相关问题