如何替换 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 过滤/搜索具有关系的数据? (拉拉维尔)

Laravel Eloquent builder 查询日志

如何从与数据透视相关的行中获取 Builder 对象 - Laravel

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