我在其中一个模型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: [],
}
是否有一种方法可以覆盖它?
答案 0 :(得分:2)
您可以通过在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);
}
}
}
答案 1 :(得分:0)
get()
函数未在 Model 类上定义,但在雄辩的 QueryBuilder 上被称为动态方法 ,这是通过调用 Model 类此函数来处理的:
public static function __callStatic($method, $parameters)
最后,当您在 Model 上调用get()
函数时,您将在Illuminate\Database\Query\Builder
类上动态调用它。
因此,您不能在不弄乱事物的情况下真正覆盖从 Model 派生的类上的可链接方法get()
。