Laravel:如何在Eloquent模型中使用FORCE INDEX强制索引?
用Eloquent模型实现FORCE INDEX查询的方法
当然可以实现你想要的链式调用写法!Laravel的Eloquent其实很灵活,下面给你两种实用的方案:
方案一:给模型添加查询作用域(推荐,优雅复用)
你可以在Order模型里定义一个自定义的查询作用域,这样就能像你期望的那样直接调用forceIndex()方法了:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { // ... 模型其他代码 /** * 强制使用指定索引的查询作用域 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $indexName * @return \Illuminate\Database\Eloquent\Builder */ public function scopeForceIndex($query, $indexName) { // 用$this->getTable()动态获取表名,避免硬编码 return $query->fromRaw("{$this->getTable()} FORCE INDEX({$indexName})"); } }
之后你就可以完全按照你想要的方式调用了:
Order::forceIndex('order_type_index')->where('type', 1)->get();
提示:记得把order_type_index换成你实际的索引名称,避免笔误哦
方案二:直接使用查询构造器的fromRaw方法(临时场景适用)
如果只是偶尔需要用一次,不想修改模型的话,也可以直接通过query()方法结合fromRaw来实现:
Order::query() ->fromRaw('orders FORCE INDEX(order_type_index)') ->where('type', 1) ->get();
这两种方法最终生成的SQL都会和你手动写的SELECT * FROM orders FORCE INDEX(order_type_index) WHERE type = 1一致,完美满足需求~
内容的提问来源于stack exchange,提问作者hellowd
相关产品推荐
相关产品推荐

