Laravel не загружает отношения для сериализованной модели - PullRequest
1 голос
/ 09 мая 2019

У меня простая работа:

class SampleJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels, DispatchesJobs;

    private $customer;

    public function __construct(Customer $customer)
    {
        parent::__construct();

        $this->customer = $customer;
    }

    public function handle()
    {
        doSomeStuff($customer->currency());
    }
}

В модели Customer у меня есть отношение для country:

clas Customer extends Model
{
    public function country()
    {
        return $this->belongsTo(Country::class);
    }

    public function currency()
    {
       return $this->country->currency();
    }
}

Когда я отправляю работу через dispatch(new SampleJob($customer)) Я получаю сообщение об ошибке в журналах:

 Call to a member function currency() on null {"code":0,"file":"Customer.php","line":386} 

Хитрость здесь в том, что если я уберу черту SerializesModels с работы, она будет работать нормально. Но я действительно не хочу этого делать, потому что это может привести к непредвиденным ошибкам (у нас много таких задач, с гораздо большим количеством свойств).

Итак, я хочу просто выяснить, почему происходит эта ошибка.

Я использую database драйвер для работы.

Ларавел 5.8.16. Также с Laravel 5.6 все работало нормально.

1 Ответ

0 голосов
/ 09 мая 2019

Рекомендуется избегать прохождения объектов при сериализации. Передача идентификатора клиента будет намного лучше в этом случае:

class SampleJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels, DispatchesJobs;

    private $customerId;

    public function __construct(int $customerId)
    {
        parent::__construct();

        $this->customerId = $customerId;
    }

    public function handle()
    {
        $customer = Customer::find($this->customerId);

        doSomeStuff($customer->currency());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...