ihp*_*nce 3 php mysql laravel eloquent
我正在开发一个可通过移动和网络应用程序访问的 API。
我需要从 API 资源发送特定字段。
我有ItemResource
public function toArray($request) {
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'price' => $this->price,
'stock' => $this->stock,
'reviews' => $this->reviews, // this is from reviews table
];
}
Run Code Online (Sandbox Code Playgroud)
我的Item模特
public function reviews() {
return $this->hasMany(ItemReview::class);
}
Run Code Online (Sandbox Code Playgroud)
我的控制器代码
return ItemResource::collection(Item::all());
Run Code Online (Sandbox Code Playgroud)
我得到这个数组
{
"data": {
"id": 10,
"name": "Item Name",
"description": "Item description",
"price": 410,
"stock": "815",
"reviews": [
{
"id": 4, // I don't want to get this field
"item_id": 10, // I don't want to get this field
"user_id": 9, // I want to show user name instead of user id
"review": "item review."
},
{
"id": 12, // I don't want to get this field
"item_id": 10, // I don't want to get this field
"user_id": 3, // I want to show user name instead of user id
"review": "item review."
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我想得到一个像这样的数组
{
"data": {
"id": 10,
"name": "Item Name",
"description": "Item description",
"price": 410,
"stock": "815",
"reviews": [
{
"user_name": 'jhon',
"review": "item review."
},
{
"user_name": 'jhon2',
"review": "item review."
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我只想显示特定字段。
我怎样才能实现这个?
select提供您需要的如果在 后面添加括号reviews,则可以返回一个Builder实例,这将允许您向关系添加查询。
有了这个,您就可以找到select您需要的字段。
public function toArray($request) {
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'price' => $this->price,
'stock' => $this->stock,
'reviews' => $this->reviews()->select('user_name', 'review')->get(),
];
}
Run Code Online (Sandbox Code Playgroud)
ReviewResource您还可以创建一个返回其自己的数据的资源。Review
class ReviewResource extends JsonResource
{
public function toArray($request)
{
return [
'user_name' => $this->user_name,
'review' => $this->review,
];
}
}
Run Code Online (Sandbox Code Playgroud)
class ItemResource extends JsonResource
{
public function toArray($request) {
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'price' => $this->price,
'stock' => $this->stock,
'reviews' => ReviewResource::collection($this->reviews),
];
}
}
Run Code Online (Sandbox Code Playgroud)