如何在 Laravel Query Builder 中使用全局作用域? (没有雄辩的模型)

Posted

技术标签:

【中文标题】如何在 Laravel Query Builder 中使用全局作用域? (没有雄辩的模型)【英文标题】:How Can I Use Global Scope in Laravel Query Builder? (No Eloquent Model) 【发布时间】:2019-05-23 13:02:06 【问题描述】:

我正在处理太多的 mysql 大视图。我不想为视图使用 Eloquent 模型。

我创建了“ViewBalance 扩展了 Illuminate\Support\Facades\DB”。一切都如我所愿。

但我需要为公司范围设置 init() 方法。

如何在没有 init() 方法的情况下使用全局作用域?

视图模型

<?php

namespace App\Models\Views;

use App\Facades\CoreService;
use Illuminate\Support\Facades\DB;

class ViewBalance extends DB

     const COMPANY_COLUMN = 'company_id';
     const TABLE = 'view_balances';

     public static function init()
     
         return parent::table(self::COMPANY_COLUMN)
             ->where(self::COMPANY_COLUMN, CoreService::companyId());
     

在控制器中

<?php

$data = ViewBalance::init()->get(); // Worked!

【问题讨论】:

我没听懂你的问题。你能解释一下你真正想做什么吗? 感谢您的评论。 laravel.com/docs/5.7/eloquent#global-scopes 就像 DB Query Builder 中的那样。有什么办法吗? 【参考方案1】:

我已经回答了我自己的问题。因为,我不想更复杂地编辑我的问题。我想谈谈这个问题的解决方案。

我在 Laravel 模型中添加了 $table_view 变量和 getView() 方法。如果你愿意,你可以为干净的代码创建特征。

它可以很容易地访问视图。它也是主要模型的一部分。

例如;

Laravel 基本账户模型

class Account extends Model 

    protected $table = 'accounts';

    protected $table_view = 'view_accounts';

    public function getView()
    
        return \DB::table($this->table_view)->where('global_scope', 1);
    


Laravel 帐户控制器

class AccountController extends Controller 

    public function index()
    
        $items = (new Account)->getView()->paginate(20);
    



【讨论】:

【参考方案2】:
public function scopeActive($query)

    return $query->where('active', true);

public function scopeInactive($query)

    return $query->where('active', false);

【讨论】:

感谢您的评论。但是您编写了本地范围。不是全局范围。 请阅读我的问题标题。我在那里写了(没有雄辩的模型)。 Eloquent 模型不同于 DB 查询构建器。 你有没有让这个工作?我正在与 Eloquent 建设者作斗争,我无法加入一段关系并自己获得总和。现在正在考虑使用 Query Buider 来代替,但后来我失去了重要的全局范围...... @DericLima 是的,我回答了我自己的问题。

以上是关于如何在 Laravel Query Builder 中使用全局作用域? (没有雄辩的模型)的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Laravel Query Builder 中执行 TRIM() 和 CONCAT()?

如何在 Laravel 4.2 中创建自定义 DB Query Builder 方法

Laravel Query builder,如何让 1 领先于哪里,另一个领先于哪里?

如何在 Laravel Query Builder 中使用全局作用域? (没有雄辩的模型)

如何将此 SQL 转换为 Laravel Query Builder 查询?