如何合并我的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"
}
]
答案 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类。该文档提供了详细的示例。