Laravel Eloquent получает все в одной паре ключ-значение - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть две таблицы posts и post_metas со схемой, как показано ниже:

POSTS
+------------+------------------+
| Field      | Type             |
+------------+------------------+
| id         | int(10) unsigned |
| title      | varchar(255)     |
| content    | longtext         |


POST_METAS
+------------+------------------+
| Field      | Type             |
+------------+------------------+
| id         | int(10) unsigned |
| post_id    | int(10) unsigned |
| key        | varchar(255)     |
| value      | longtext         |

используя простые отношения один ко многим, я получаю этот вывод

[
  {
    "id": 1,
    "title": "Dibbert LLC",
    "content": null,
    "post_metas": [
      {
        "key": "code",
        "value": "YSRSLBZ7"
      },
      {
        "key": "agent_id",
        "value": "32"
      }
    ]
  }
]

Мне интересно, возможно ли иметь мета-объекты в виде объекта, а не массива, например:

[
  {
    "id": 1,
    "title": "Dibbert LLC",
    "content": null,
    "post_metas": {
        "code": "YSRSLBZ7",
        "agent_id": "32"
      }
  }
]

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Laravel по умолчанию возвращает экземпляр класса Collection . Это также применяется при запросе элементов отношений.

Теперь, если вы хотите настроить возвращаемые поля (например, скрыть, преобразовать или добавить что-то), вы можете использовать Ресурсы API . Это позволит вам легко трансформировать ваши ответы.

Отметьте этот другой ответ , чтобы помочь вам с ресурсами API.


Обновление

Чтобы реализовать ресурсы API в соответствии с вашими потребностями, нам необходимо:

  1. Определение классов PostResource и PostMetaResource.
  2. Настройте их
  3. Используйте их в контроллере, чтобы вернуть нужные данные в представление / API

Определение классов ресурсов API

php artisan make:resource PostMetaResource
php artisan make:resource PostResource

Настройка

App / Http / Ресурсы / PostMetaResource.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class PostMetaResource extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'key' => $this->key,
            'value' => $this->value,
        ];
    }
}

App / Http / Ресурсы / PostResource.php

class PostResource extends Resource
{

    use PostMetaResource;

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            // the rest of your fields..

            // here is where we load the relationship resource:
            'post_metas' => PostMetaResource::collection($this->whenLoaded('post_metas')),
        ];
    }
}

Применение их

use App\Http\Resources\PostResource;

//

public function index(Request $request)
{
    $posts = Post::with('post_metas')->get();

    return PostResource::collection($posts);
}
0 голосов
/ 01 ноября 2018

Вы не можете изменить то, как Eloquent возвращает коллекции отношений, и не должны этого делать, но вы, безусловно, можете управлять коллекцией в своем ответе:

$model->post_metas->pluck('value', 'key');

Ознакомьтесь со всеми доступными методами сбора .

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