Я довольно новичок в Laravel, и сейчас я включаю интерфейс уведомлений в режиме реального времени (например, раскрывающийся список напоминаний об уведомлениях) в проекте, в котором я использую Laravel Broadcast. Я хочу имитировать формат JSON из API, который я использую, с тем, который добавляется, как только событие запускается из моих журналов (встреч), чтобы было проще манипулировать с одним броском вперед конец. Объект, который я хочу имитировать, похож на объект ниже.
[
{
"id": 39,
"user_id": 1,
"campaign_id": 134,
"lead_id": 12785,
"date": "2020-04-16 08:43:00",
"type": "phone-appointment",
"created_at": "2020-04-05 08:43:38",
"updated_at": "2020-04-05 08:43:38",
"lead": {
"id": 12785,
"first_name": "First Name",
"last_name": "Last Name",
"phone_number": "+12345678911",
"city": null,
"car": null,
"created_at": "2020-02-11 21:33:19",
"updated_at": "2020-02-11 21:33:19"
}
]
Я использую отношение polymorphi c, и API индексируется с помощью этого кода:
public function index()
{
$userIsSuperAdmin = $this->user->role->contains('name', 'super-admin');
$userIsManager = $this->user->role->contains('name', 'manager');
$notifications = Notification::whereNull('read_at')
->where(function ($query) use ($userIsSuperAdmin, $userIsManager) {
if ($userIsSuperAdmin) {
return true;
}
if ($userIsManager) {
return $query->whereIn('user_id', $this->user->company->users->pluck('id'));
}
return $query->where('user_id', $this->user->id);
})
->orderBy('created_at', 'desc')
->get();
$result = [];
foreach ($notifications as $notification) {
switch ($notification->notificationable_type) {
case 'appointment';
$origin = CampaignLeadAppointment::with('lead')
->where('id', $notification->notificationable_id)
->first();
$result[] = $origin;
break;
case 'sms';
$origin = IncomingSms::with('lead')
->where('id', $notification->notificationable_id)
->first();
$result[] = $origin;
break;
case 'call';
$origin = IncomingCall::with('lead')
->where('id', $notification->notificationable_id)
->first();
$result[] = $origin;
break;
}
}
return $result;
}
Контроллер широковещательной передачи событий, который я создал, срабатывает при создании нового журнала:
class NewNotification implements ShouldBroadcast
public $notification;
/**
* Create a new event instance.
*
* @param $notification
*/
public function __construct($notification)
{
$this->notification = $notification;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new Channel('new-notification');
}
public function broadcastWith()
{
if ($this->notification->lead_id != 0) {
$lead = Lead::where('id', $this->notification->lead_id)->first();
return array_merge($this->notification->toArray(), $lead->toArray());
}
return $this->notification->toArray();
}
Вот данные, которые он добавляет в vue внешний прослушиватель (Faulty JSON):
[
{
"id": 13521,
"user_id": 1,
"campaign_id": 134,
"date": "2020-04-16 08:43:00",
"type": "phone-appointment",
"created_at": "2020-04-05 08:43:38",
"updated_at": "2020-04-05 08:43:38",
"lead_id": 13521,
"first_name": "First Name",
"last_name": "Last Name",
"phone_number": "+12345678911",
"city": null,
"car": null,
}
]
Я пытаюсь использовать json_encode, но все, что он делает, это разделяет как объекты уведомлений, так и ведущие, а не вкладывает их. Какой синтаксис мне следует использовать, чтобы я мог вкладывать объект красноречивой модели в другой объект красноречивой модели без использовать с методом?