Laravel Eloquent получает все в одной паре ключ-значение

У меня есть две таблицы 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"
      }
  }
]

Как вы запрашиваете post, чтобы получить post_meta? Laravel действительно возвращает коллекцию объектов, которые должны выглядеть так, как вы хотите.

Kenny Horna 01.11.2018 20:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
7 743
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Прочтите все доступные методы сбора.

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

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

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


Обновлять

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

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

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

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

Настройка

Приложение / 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,
        ];
    }
}

Приложение / 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);
}

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

Salal Aslam 01.11.2018 21:01

ха-ха, я разместил это, потому что то, как вы выводите сейчас, мне немного не нравится. Я обновил свой ответ, добавив ссылку на ответ, который я давал ранее по этой теме (Ресурсы API).

Kenny Horna 01.11.2018 21:06

Мне нужно использовать метод toArray в модели, возвращающий только поля ключа и значения, также я пропустил id и post_ids, чтобы вопрос был как можно короче

Salal Aslam 01.11.2018 21:09

Можете ли вы обновить свой ответ, включив метод Resource, который даст мне результат, который я упомянул в вопросе?

Salal Aslam 01.11.2018 21:13

@SalalAslam сделано. Я рекомендую вам прочитать документацию по этому вопросу. Это намного яснее, чем мой ответ. Хорошего дня.

Kenny Horna 01.11.2018 21:31

Другие вопросы по теме