首页 > 解决方案 > Laravel - 使用 where 时 Eloquent 覆盖 get 方法

问题描述

我在我的一个模型中覆盖了 eloquentget()方法OrderStatus

public static function get()
{
    return "hit";
}

当我在没有正常工作的情况下调用它时

>>> $order_statuses = OrderStatus::get();
=> "hit"

但是当我用它调用它时,where它再次使用parentget 方法:

>>> $order_statuses = OrderStatus::where('order_id', 24)->get();
=> Wilgucki\Csv\CsvCollection {#4434
      all: [],
   }

有没有办法覆盖它?

标签: laraveleloquentoverriding

解决方案


您可以通过覆盖get()查询构建器中的方法来做到这一点,此中型帖子\Illuminate\Database\Query\Builder中提供了此覆盖的示例。但是在您的情况下,您似乎只想在对模型使用时才覆盖它。OrderStatuses

好消息是Builder该类引用了该表

/**
 * 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);
        }
    }
}

推荐阅读