Laravel - 当使用where时,Eloquent覆盖get方法

问题描述 投票:2回答:2

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

有没有办法覆盖它呢?

laravel eloquent override
2个回答
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);
        }
    }
}

0
投票

get()函数没有在Model类上定义,但它在Eloquent QueryBuilder上被称为动态方法,通过调用Model类来处理这个函数:

public static function __callStatic($method, $parameters)

最后,当你在Model上调用get()函数时,你会在Illuminate\Database\Query\Builder类上动态调用它。

因此,您无法真正覆盖从Model派生的类上的可链接方法get(),而不会弄乱事物。

© www.soinside.com 2019 - 2024. All rights reserved.