Laravel-使用where时雄辩的重写get方法

时间:2019-02-26 18:09:02

标签: laravel eloquent override

我在其中一个模型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: [],
   }

是否有一种方法可以覆盖它?

2 个答案:

答案 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()