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






Вы не можете изменить, как Eloquent возвращает коллекции отношений, и не должны этого делать, но вы, безусловно, можете управлять коллекцией в своем ответе:
$model->post_metas->pluck('value', 'key');
Прочтите все доступные методы сбора.
Laravel по умолчанию возвращает экземпляр класса Коллекция. Это также применяется при запросе элементов отношений.
Теперь, если вы хотите настроить возвращаемые поля (например, скрыть, преобразовать или добавить что-то), вы можете использовать Ресурсы API. Это позволит вам легко преобразовать ваши ответы.
Проверьте этот другой ответ, чтобы помочь вам с ресурсами 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);
}
в этом ответе есть все, кроме ответа;) это то, чем я сейчас занимаюсь, меня больше интересует последняя часть, которую вы упомянули
ха-ха, я разместил это, потому что то, как вы выводите сейчас, мне немного не нравится. Я обновил свой ответ, добавив ссылку на ответ, который я давал ранее по этой теме (Ресурсы API).
Мне нужно использовать метод toArray в модели, возвращающий только поля ключа и значения, также я пропустил id и post_ids, чтобы вопрос был как можно короче
Можете ли вы обновить свой ответ, включив метод Resource, который даст мне результат, который я упомянул в вопросе?
@SalalAslam сделано. Я рекомендую вам прочитать документацию по этому вопросу. Это намного яснее, чем мой ответ. Хорошего дня.
Как вы запрашиваете
post, чтобы получитьpost_meta? Laravel действительно возвращает коллекцию объектов, которые должны выглядеть так, как вы хотите.