【问题标题】:How Can I Use Global Scope in Laravel Query Builder? (No Eloquent Model)如何在 Laravel Query Builder 中使用全局作用域? (没有雄辩的模型)
【发布时间】: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!

【问题讨论】:

标签: php laravel


【解决方案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 是的,我回答了我自己的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2015-07-09
    • 2015-08-15
    • 1970-01-01
    • 2015-06-27
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多