【问题标题】:Override Eloquent Query Builder覆盖 Eloquent 查询生成器
【发布时间】:2015-02-02 13:54:34
【问题描述】:

我正在尝试覆盖 Eloquent 的查询构建器。

我为我的MyModel 尝试了以下操作:

<?php

class CustomQueryBuilder extends Illuminate\Database\Query\Builder
{
    public function get($columns = array('*'))
    {
        die('get');
    }
}

use CustomQueryBuilder as Builder;
class MyModel extends \Illuminate\Database\Eloquent\Model
{
    // the model that needs the custom query builder
}

但是当我运行MyModel::get() 时,它仍然返回对象而不是死亡。

任何想法如何使这项工作?

【问题讨论】:

  • 你想达到什么目的?

标签: php laravel laravel-4 eloquent query-builder


【解决方案1】:

我认为最好的方法是:

<?php

namespace MyNamespace\Models;
use Illuminate\Database\Eloquent\Builder as BaseBuilder;
use \Illuminate\Database\Eloquent\Model;


class Builder extends BaseBuilder
{
   public function like($key, $value){
       return $this->orWhere($key, 'like', '%' . $value . '%');
   }
}  


class MyModel extends Model
{

    protected $table = 'mytable';

    public function newEloquentBuilder($query)
    {
       return new Builder($query);
    }
} 

【讨论】:

    【解决方案2】:

    我不确定您到底想要做什么,但至少您需要在模型中实现(并覆盖)Illuminate\Database\Eloquent\Model::newBaseQueryBuilder 以使其使用新的 Builder 类。

    /**
     * Get a new query builder instance for the connection.
     *
     * @return \Illuminate\Database\Query\Builder
     */
    protected function newBaseQueryBuilder()
    {
        $conn = $this->getConnection();
        $grammar = $conn->getQueryGrammar();
        return new CustomQueryBuilder($conn, $grammar, $conn->getPostProcessor());
    }
    

    【讨论】:

    • 非常感谢@jacob-budin
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 2014-05-13
    • 2020-07-09
    • 2013-01-25
    • 2019-05-14
    • 2015-07-21
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多