我在我的一个模型get()
中覆盖了雄辩的OrderStatus
方法
public static function get()
{
return "hit";
}
当我在没有工作正常的地方打电话的时候
>>> $order_statuses = OrderStatus::get();
=> "hit"
但是当我用where
调用它时,它再次使用parent
get方法:
>>> $order_statuses = OrderStatus::where('order_id', 24)->get();
=> Wilgucki\Csv\CsvCollection {#4434
all: [],
}
有没有办法覆盖它呢?
你可以通过覆盖get()
中查询构建器中的\Illuminate\Database\Query\Builder
方法来做到这一点,这个覆盖的一个例子在这个medium post中提供。但在你的情况下,似乎你只想在对OrderStatuses
模型使用时才覆盖它。
好消息是Builder
类有一个reference to the table:
/**
* The table which the query is targeting.
*
* @var string
*/
public $from;
它设置在这里:
/**
* Set the table which the query is targeting.
*
* @param string $table
* @return $this
*/
public function from($table)
{
$this->from = $table;
return $this;
}
所以你可以这样做:
namespace App\Override;
class QueryBuilder extends \Illuminate\Database\Query\Builder {
//@Override
public function get($columns = ['*']) {
if ($this->from == 'OrderStatus') {
// customize the call
} else {
//Return default
return parent::get($columns);
}
}
}
get()
函数没有在Model类上定义,但它在Eloquent QueryBuilder上被称为动态方法,通过调用Model类来处理这个函数:
public static function __callStatic($method, $parameters)
最后,当你在Model上调用get()
函数时,你会在Illuminate\Database\Query\Builder
类上动态调用它。
因此,您无法真正覆盖从Model派生的类上的可链接方法get()
,而不会弄乱事物。