如何在 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 领先于哪里,另一个领先于哪里?