Создайте вложенный JSON объект с двумя laravel красноречивыми объектами модели - PullRequest
0 голосов
/ 07 апреля 2020

Я довольно новичок в 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, но все, что он делает, это разделяет как объекты уведомлений, так и ведущие, а не вкладывает их. Какой синтаксис мне следует использовать, чтобы я мог вкладывать объект красноречивой модели в другой объект красноречивой модели без использовать с методом?

1 Ответ

0 голосов
/ 07 апреля 2020

Использование этого вместо array_merge (), похоже, ответило на вопрос.

 public function broadcastWith()
{
    if ($this->notification->lead_id != 0) {

        $lead = Lead::where('id', $this->notification->lead_id)->first();

        $arr = $this->notification->toArray();
        $arr['lead'] = $lead->toArray();

        return $arr;
    }

    return $this->notification->toArray();

}

теперь данные о событиях, отправляемые внешнему интерфейсу, структурированы следующим образом:

{
"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"
}

Как добавить элемент в JSON объект, используя PHP?

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