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

Я использую ограничение нетерпеливой нагрузки с анонимной функцией:

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');
}])->get();

Теперь я хочу заменить анонимную функцию функцией класса. Согласно PHP: Как использовать функцию класса в качестве обратного вызова Я нашел

Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода с индексом 1.

Таким образом, я ожидал, что будет работать следующее:

public function start()
{
   $users = App\User::with(['posts' => [$this, 'addRestrain']])->get();
   // ...
}

private function addRestrain($query)
{
  $query->where('title', 'like', '%first%');
}

Однако Laravel обнаруживает, что переданный параметр - это не замыкание, а массив:

"Ошибка типа: аргумент 3 передан Подсветка \ База данных \ Eloquent \ Builder :: eagerLoadRelation () должна быть экземпляр Closure, заданный массив, вызванный в

Означает ли это, что невозможно использовать функцию класса для ограничения активной нагрузки?

1 Ответ

0 голосов
/ 15 мая 2018

Начиная с PHP 7.1.0, вы можете использовать Closure::fromCallable ( документы ):

$users = App\User::with(
  [ 'posts' => \Closure::fromCallable([$this, 'addRestrain']) ]
)->get();

В противном случае вы можете использовать анонимный доступ.вместо этого вызывается перенос функции $this->addRestrain.

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