php - 引用资源中的资源时 Laravel 错误
问题描述
我在控制器中使用 Laravel Json 资源,如下所示
public function index(Request $request)
{
$itemsWithTranslations = MenuItem::where(['menu_id' => $request->id, 'parent_id' => null])
->with(['children', 'translations'])
->orderBy('sort_order', 'asc')
->get();
return MenuItemResource::collection($itemsWithTranslations);
}
现在我想在这个集合中生成一个集合,其中包含正在显示的项目的子项。
以下代码工作正常。注意我是如何注释掉儿童参考的
class MenuItemResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'text' => $this->title,
// 'children' => MenuItemResource::collection($this->whenLoaded('children')),
'data' => [
'id' => [
'value' => $this->id,
'type' => 'hidden'
],
'title' => [
'value' => $this->title,
'type' => 'text',
'label' => 'Title'
],
'resource_link' => [
'value' => $this->resource_link,
'type' => 'text',
'label' => 'Resource Link'
],
'translations' => MenuItemTranslationResource::collection($this->whenLoaded('translations'))->keyBy(function ($translation) {
return $translation['locale'];
})
]
];
}
}
当我取消注释孩子时,我收到以下错误
“调用未定义的方法 Illuminate\Http\Resources\Json\AnonymousResourceCollection::keyBy()”
将资源包含在资源中是错误的吗?或者我应该怎么做?
模型
class MenuItem extends Model
{
protected $table = 'menu_items';
protected $fillable = ['menu_id', 'parent_id', 'title', 'order', 'resource_link', 'html_class', 'is_blank'];
public function translations()
{
return $this->hasMany(MenuItemTranslation::class, 'menu_item_id');
}
public function children()
{
return $this->hasMany(MenuItem::class, 'parent_id');
}
}
额外的信息
当我返回以下数据时,它确实返回空作为孩子的集合。
MenuItemResource::collection($this->children);
这返回
而如果我返回没有集合的孩子,它会返回它们(对于 1 项,这是正确的)
return $this->children;
返回
解决方案
你应该使用 ChildrenResource::collection
'children' => ChildrenResource::collection($this->whenLoaded('children'))
希望这有效。
如果不存在,则创建一个 ChildrenResource 类。
推荐阅读
- php - Gmail API 错误:尝试进行身份验证时出现 redirect_uri_mismatch。(PHP)
- java - JFXButton:无法解析符号
- android - Unity Google Cardboard 恢复在 Android 上构建时所做的任何相机更改
- android - RuntimeException 在没有显式调用生命周期方法的情况下执行未恢复的活动暂停
- c++ - libpd:获取补丁中的接收者列表
- python - 远程桌面 - 桌面中的显示元素,不通过缓冲区传输
- javascript - 按对象中的 ng-repeat (key, value) 对中的值排序
- windows-10-mobile - Xamarin.Forms UWP 项目不会安装在 Windows 10 移动版上
- rabbitmq - spring-RabbitMQ 手动监听队列
- google-colaboratory - 在 Google Colaboratory 中从 requirements.txt 安装依赖项