Как написать пользовательскую функцию в модели? - PullRequest
0 голосов
/ 15 ноября 2018

Имеются данные модели:

class Order extends Model
{
}

Как написать собственный метод внутри класса Order, чтобы его можно было вызывать в конструкторе следующим образом:

Order::myMethod()
Order->myMethod()

Где myMethod равно:

public function myMethod() {
     return DB::query(<SQL QUERY>);
}

Цель состоит в том, чтобы переместить запросы SQL внутри класса модели, которые не запутывают этот код в контроллерах.

Ответы [ 5 ]

0 голосов
/ 15 ноября 2018

Вы можете достичь желаемого поведения, используя магические методы __ call и __ callStatic если ваш реальный метод статичен, вы можете использовать __call() для перехвата всех "нестатических" вызовов и использования егодля вызова static и использования __callStatic для переадресации вызовов новому экземпляру в этот класс.

Ваши методы должны быть всегда статическими, потому что если существует нестатический метод и вы вызываете его статически, php вызывает ошибку

Non-static method Foo::myMethod() should not be called statically

Нет проблем, если ваш метод статичен

class Order extends Model {
    public static function myMethod() {
        return static::query()->where(...)->get(); // example
    }
    public function __call($name, $arguments) {
        return forward_static_call_array([__CLASS__, $name], $arguments);
    }
    public static function __callStatic($name, $arguments) {
        return call_user_func_array([app(__CLASS__), $name], $arguments);
    }
}

(new Order())->myMethod();
Order::myMethod();
0 голосов
/ 15 ноября 2018

Я не могу понять, какая у вас проблема.но если вы используете laravel, то вы можете написать собственный метод внутри модели ABC, например:

class ABC extends Model
{
   //here is your fillable array;
   public function abc()
   {
      //Here is your Eloquent statement or SQL query;
   }
}

, просто вызвать этот метод abc () внутри контроллера, как этот

 use ABC;
 class AbcController extends Controller
 {
     private $_abc;          // it is private variable
     // this is constructor
     public function __construct(ABC $abc)
     {
        $this->_abc= $abc;
     }
     public function abcMethod()
     {
        $this->_abc->abc();
     }
 }

Спасибо

0 голосов
/ 15 ноября 2018

Полагаю, вы спрашиваете о статических функциях:

class Order extends Model {
     public static function myMethod() {
     }
}

и вы можете звонить куда угодно, как

Order::myMethod();
0 голосов
/ 15 ноября 2018

Вместо создания пользовательской функции в модели, вы можете использовать черты для достижения желаемого результата.

Пожалуйста, выполните одно из следующих действий: -

0 голосов
/ 15 ноября 2018

Я не верю, что понимаю ваше намерение. Вы заявили:

Цель состоит в том, чтобы переместить запросы SQL внутри класса модели, которые не запутывают этот код в контроллерах.

Почему Order->myMethod() требует вызова внутри конструктора? Если вы пытаетесь настроить слой доступа к данным для эффективной работы, вы можете использовать хранилища данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...