Laravel合并的关系

问题描述 投票:0回答:2

我该如何合并我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"
  }
]
laravel laravel-5.4
2个回答
0
投票

你写的邮件和文件复数意味着它是一个一对多,平均消息和文件应该检索对象的集合

无论如何,如果它的API(我看你想返回JSON),你可以使用laravel ressources(https://laravel.com/docs/5.7/eloquent-resources),并准备你的对象

return [
    'name' => $this->name,
    'sender' => $this->messages->sender,
    'size' => $this->files->size
]

0
投票

当您使用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.使用资源格式数据:

Resources是一种映射或调节剂,其将返回格式你喜欢的响应。它标准化了的响应,你想要的方式。

您可以创建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));

其优点是,如果你希望邮件看起来一定的方式,你可以嵌套的资源类。该文档有详细的例子。

© www.soinside.com 2019 - 2024. All rights reserved.