【问题标题】: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());
}