如何替换 Laravel Builder 类
Posted
技术标签:
【中文标题】如何替换 Laravel Builder 类【英文标题】:How to replace the Laravel Builder class 【发布时间】:2014-06-21 22:07:18 【问题描述】:我想用我自己的继承自 Laravel 构建器类替换它。我认为这就像App::bind
一样简单,但似乎不起作用。我应该在哪里放置绑定以及在 Laravel 中这样做的正确方法是什么?
这是我尝试过的:
我的建造者:
use Illuminate\Database\Eloquent\Builder as BaseBuilder;
class Builder extends BaseBuilder
/**
* Find a model by its primary key.
*
* @param mixed $id
* @param array $columns
* @return \Illuminate\Database\Eloquent\Model|static|null
*/
public function find($id, $columns = array('*'))
Event::fire('before.find', array($this));
$result = parent::find($id, $columns);
Event::fire('after.find', array($this));
return $result;
接下来我尝试在 bootstrap/start.php 文件中注册绑定,如下所示:
$app->bind('Illuminate\\Database\\Eloquent\\Builder', 'MyNameSpace\\Database\\Eloquent\\Builder');
return $app;
【问题讨论】:
【参考方案1】:这两个答案在某种程度上都是正确的。你必须决定你的目标是什么。
更改 Eloquent Builder
例如,如果您只想为 eloquent 模型添加新方法(例如,类似范围的东西,但可能更高级一些,因此不可能在范围内)
创建一个扩展 Eloquent Builder 的新类,例如 CustomEloquentBuilder。
use Illuminate\Database\Eloquent\Builder;
class CustomEloquentBuilder extends Builder
public function myMethod()
// some method things
创建自定义模型并覆盖方法newEloquentBuilder
use Namespace\Of\CustomEloquentBuilder;
use Illuminate\Database\Eloquent\Model;
class CustomModel extends Model
public function newEloquentBuilder($query)
return new CustomEloquentBuilder($query);
更改数据库查询生成器
例如修改所有数据库访问的 where 子句
创建一个扩展数据库生成器的新类,例如 CustomQueryBuilder。
use Illuminate\Database\Query\Builder;
class CustomQueryBuilder extends Builder
public function myMethod()
// some method things
创建自定义模型并覆盖方法newBaseQueryBuilder
use Namespace\Of\CustomQueryBuilder;
use Illuminate\Database\Eloquent\Model;
class CustomModel extends Model
protected function newBaseQueryBuilder()
$connection = $this->getConnection();
return new CustomQueryBuilder(
$connection, $connection->getQueryGrammar(), $connection->getPostProcessor()
);
Laravel 版本:5.5 / 此代码未测试
【讨论】:
【参考方案2】:上面的答案并不完全适用于 laravel > 5 所以我做了一些挖掘,我发现了这个!
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L1868
改用这个!
protected function newBaseQueryBuilder()
$conn = $this->getConnection();
$grammar = $conn->getQueryGrammar();
return new QueryBuilder($conn, $grammar, $conn->getPostProcessor());
【讨论】:
【参考方案3】:Illuminate\Database\Eloquent\Builder
类是一个内部类,因此它不是注入到Illuminate\Database\Eloquent\Model
类中的依赖项,而是在那里进行了硬编码。
要做你想做的事,我会将Illuminate\Database\Eloquent\Model
扩展为MyNamespace\Database\Eloquent\Model
类并覆盖newEloquentBuilder
函数。
public function newEloquentBuilder($query)
return new MyNamespace\Database\Eloquent\Builder($query);
然后将MyNamespace\Database\Eloquent\Model
别名为Eloquent
aliases
in app/config/app.php
【讨论】:
以上是关于如何替换 Laravel Builder 类的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Laravel Eloquent 和 Laravel Query Builder 进行联合查询?
如何在 json 数据 laravel 5.1 中查询 Builder
如何使用 spatie/laravel-query-builder 过滤/搜索具有关系的数据? (拉拉维尔)