Если я правильно понимаю, причина в том, что ваша модель использует составной ключ, который не поддерживается eloquent .
Так вот что я думаю, что на самом деле происходит с моим ограниченным знание всего модуля уведомления / вещания.
- Вы пытаетесь отправить свое уведомление, которое затем диспетчер передает вашему уведомлению менеджеру вещания, поскольку вы указали его для широковещательной передачи с помощью метода
- Затем менеджер вещания попытается pu sh ваше
MyNotification
событие в очередь - Чтобы поместить sh событие в очередь, оно попытается создать полезную нагрузку вашего класса уведомлений, который попытается сериализовать его
- Базовый класс
Notification
, который вы расширяете, фактически реализует черту Illuminate\Queue\SerializesModels
и поэтому автоматически попытается сериализовать всю модель в атрибутах вашего класса уведомлений - При попытке сериализации вашей красноречивой коллекции
Game
объекты, коллекция затем пытается вызвать getQueueableId
для каждой вашей модели в коллекции, которая затем завершается ошибкой, потому что она пытается извлечь атрибут на основе вашего составного ключа
Что касается решения я бы сказал, попытаться удалить ваш составной ключ на модели, так как кажется, что это не будет при использовании eloquent не работает должным образом.
// in Game model
protected $primaryKey = 'id';
Согласно этой документации для очередей, вы также можете попытаться добавить метод broadcastWith
в свой класс MyNotification
, хотя я Я не уверен, что это обойдёт метод сериализации SerializeModels
trait.
// in MyNotification
public function broadcastWith()
{
return ['id' => $this->id];
}
Или, согласно вашей собственной методике проб и ошибок, вместо инициализации $this->games
с коллекцией, вы можете привести его в массив. В конце концов, ваш toBroadcast
метод - это тот, который фактически контролирует трансляцию.
$this->games = $games->toArray();
И ваш последний вариант - переопределить метод getQueueableId()
вашей Game
модели.
// in Game Model
public function getQueueableId()
{
return $this->id;
// or if you still want to utilize your composite keys. UNTESTED
return $this->key_one.$this->key_two;
}