Laravel合并关系

时间:2019-02-04 12:23:41

标签: laravel laravel-5.4

如何合并我的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 :(得分:0)

您写的消息和文件为复数形式,表示一个OneToMany,意味着消息和文件应检索对象的集合

无论如何,如果它用于API(如我所见,您想返回json),则可以使用laravel资源(https://laravel.com/docs/5.7/eloquent-resources)并准备对象

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

答案 1 :(得分: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));

优点是,如果希望消息以某种方式显示,则可以嵌套Resource类。该文档提供了详细的示例。