Laravel объединить отношения - PullRequest
0 голосов
/ 04 февраля 2019

Как я могу объединить свой код Laravel, чтобы иметь только одну коллекцию?У меня есть следующее

$users = User::with(['messages'=> function($query) {
    $query->select('sender');
}])->with(['files' => function($query) {
  $query->select('size');
}])->get(['name']);

Я ожидаю, что мои результаты будут

[
  {
    "name": "user 1",
    "sender": "user 3",
    "size": "3 MB"
  }
]

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Когда вы используете отношение with(), результирующая коллекция будет иметь относительные коллекции внутри нее.

В вашем случае:

user_collection
 - userdata
 .
 .
 - file_collection
 - message_collection

Теперь есть несколько способов, которыми вы можетесделай это:

1.Есть запрос на присоединение:

$users = User::join('messages', 'messaged.user_id', '=', 'users.id')
    ->join('files', 'files.user_id', '=', 'users.id')
    ->select('users.name', 'files.size', 'messages.sender')
    ->get();

2.Отформатируйте данные, используя ресурсы:

Ресурсы - это своего рода преобразователь или модификатор, который возвращает ответ в нужном вам формате.Он стандартизирует ответ так, как вы хотите.

Вы можете создать app\Http\Resources\UserResource.php:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'size' => $this->files->size,
            'sender' => $this->messages->sender,
            'name' => $this->name
        ];
    }
}

И затем внутри контроллера:

return new UserResource(User::find(1));

Преимущество состоит в том, чтоесли вы хотите, чтобы сообщения выглядели определенным образом, вы можете вкладывать классы Resource.В документации есть подробные примеры.

0 голосов
/ 04 февраля 2019

Вы писали сообщения и файлы как множественное число, означающее, что это OneToMany, то есть сообщения и файлы должны извлекать коллекцию объектов

В любом случае, если это для API (как я вижу, вы хотите вернуть json), вы можете использоватьРесурсы Ларавела (https://laravel.com/docs/5.7/eloquent-resources) и подготовьте ваш объект

return [
    'name' => $this->name,
    'sender' => $this->messages->sender,
    'size' => $this->files->size
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...