当前位置: 首页 > 知识库问答 >
问题:

如何替换Laravel Builder类

施德运
2023-03-14

我想用我自己的从Laravels扩展而来的构建器类来替换Laravels。我原以为这会像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;

共有3个答案

史钊
2023-03-14

这两个答案在某种程度上都是正确的。你必须决定你的目标是什么。

改变雄辩的建设者

例如,如果您只想为有说服力的模型添加一个新方法(例如,类似于作用域,但可能更高级一些,因此在作用域中不可能)

创建一个扩展EloQuentBuilder的新类,例如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/此代码未测试

曾嘉祯
2023-03-14

上面的答案对拉威尔来说并不完全适用

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());
}
景鹏云
2023-03-14

类是一个内部类,因此它不是注入到类中的依赖关系,而是硬编码。

要执行您想要执行的操作,我将扩展illumb\Database\Eloquent\ModelMyNamespace\Database\Eloquent\Model类并重写newEloquentBuilder函数。

public function newEloquentBuilder($query)
{
   return new MyNamespace\Database\Eloquent\Builder($query);
}

然后别名MyNamespace\数据库\雄辩\模型雄辩app/config/app.php中的别名

 类似资料:
  • 我得到了一个导入的文本块,但格式并不总是那么完美。之后我会尝试用jquery解决这个问题。所以我开始用 替换 : null null 但替换不起作用。最终的html应该如下所示:

  • getDrawable已弃用。我如何重写这段代码。我找不到答案。 什么是新的最好的方式来使用它的功能。

  • 我的asp中有以下WebClient。net mvc web应用程序: 那么,有人可以建议我如何将它从WebClient更改为HttpClient吗?

  • 问题内容: 在Java中,我有一个文件路径,例如“ C:\ A \ B \ C”,我希望将其更改为“ C:/ A / B / C”。如何替换反斜杠? 问题答案: String text = “C:\A\B\C”; String newString = text.replace(“\“, “/”); System.out.println(newString);

  • 问题内容: 我试图将字符串分成数组并替换为,但无法做到,我也尝试了String.replaceAll这样的东西。 我想提供一个通往JNI的路径,并且它只能以这种方式读取。 问题答案: 在这种情况下不要使用- 这是用正则表达式指定的,这意味着您需要更多的转义。这应该很好: 请注意,由于Java字符串文字中的原因,反斜杠加倍-因此此处涉及的 实际 字符串是“单反斜杠”和“双反斜杠”-而不是双倍和四倍。

  • 我有以下布局 一切正常,但我想用一个片段替换浏览器 这不是重新调整ViewPager的间距,我该怎么办???