我该如何合并我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"
}
]
你写的邮件和文件复数意味着它是一个一对多,平均消息和文件应该检索对象的集合
无论如何,如果它的API(我看你想返回JSON),你可以使用laravel ressources(https://laravel.com/docs/5.7/eloquent-resources),并准备你的对象
return [
'name' => $this->name,
'sender' => $this->messages->sender,
'size' => $this->files->size
]
当您使用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));
其优点是,如果你希望邮件看起来一定的方式,你可以嵌套的资源类。该文档有详细的例子。