Laravel Eloquent 和 Query Builder “with (nolock)”

Posted

技术标签:

【中文标题】Laravel Eloquent 和 Query Builder “with (nolock)”【英文标题】:Laravel Eloquent and Query Builder "with (nolock)" 【发布时间】:2015-06-15 07:33:43 【问题描述】:

我有一些麻烦,因为我的查询在 from 子句之后没有 with (nolock) 指令。

因此,一些查询锁定数据库,然后没有人可以使用系统。

如何在 Eloquent & Query Builder 中使用 with (nolock)

例如..在这个查询中:

return static::with('campaignType')
    ->where('active', 1)
    ->get();

我想要以下结果:

select
    *
from campaigns with (nolock)
inner join campaign_types with (nolock) on campaign_types.id = campaigns.campaign_type_id 
where campaigns.active = 1 

【问题讨论】:

请发布一些代码供我们审核。如果 Laravel 不支持您要查找的内容,您可能还想查看 DB::raw 方法。 我很确定DB::raw 有效,但我想要一个雄辩的/查询构建器解决方案。只有在 eloquent 中没有选项时,我才尝试使用 raw。 【参考方案1】:

这是我处理 eloquent 的方法(在 Laravel 5.1 和 5.2 上测试)

您需要在模型中添加范围:

public function scopeNoLock($query)

    return $query->from(DB::raw(self::getTable() . ' with (nolock)'));

那么你可以这样称呼它

return Model::noLock()->get();

【讨论】:

【参考方案2】:

你可以像这样设置“with(nolock)”:

DB::table('campaigns')->lock('WITH(NOLOCK)')

【讨论】:

这正是我想要的!不知道查询生成器有这个。【参考方案3】:

简单的方法:

/**
 * @param $query
 * @return $this
 */
public function scopeNoLock($query)

    return $query->from($query->getQuery()->raw(self::getTable() . ' with (nolock)'));

【讨论】:

【参考方案4】:

你也可以通过sharedLock方法使用原生解决方案

【讨论】:

以上是关于Laravel Eloquent 和 Query Builder “with (nolock)”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel Eloquent 和 Laravel Query Builder 进行联合查询?

Laravel Eloquent Query 包含枢轴和关系

Laravel Eloquent 和 Query Builder “with (nolock)”

将 MariaDB 语句转换为 Laravel4 Eloquent-Query

Laravel:在“query-builder”或“eloquent”中更改原始查询

Laravel Eloquent Query 使用 WHERE 和 OR AND OR?