Laravel - Eloquent переопределить метод get при использовании где - PullRequest
0 голосов
/ 26 февраля 2019

Я переопределяю красноречивый метод 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 голосов
/ 27 февраля 2019

Вы можете сделать это, переопределив метод 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);
        }
    }
}
0 голосов
/ 26 февраля 2019

Функция get() не определена в классе Model , но она вызывается как динамический метод в Eloquent QueryBuilder , то есть обрабатываетсявызывая класс Model этой функции:

public static function __callStatic($method, $parameters)

В конце, когда вы вызываете функцию get() для Model , вы вместо этого вызываете ее динамическикласс Illuminate\Database\Query\Builder.

Таким образом, вы не сможете переопределить цепной метод get() для класса, производного от Model , не испортив ничего.

...