You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Repository模式下edit()函数语法问题求助(含fk_author、fk_bookcase)

问题分析与修复方案

咱们来一步步拆解你代码里的问题:

核心问题点

1. Repository层未返回所需的全部数据

你在BookRepository的edit()方法里,虽然查询了$authors和$bookcases,但最终只返回了单条图书数据,这两个关键数据根本没传递给控制器。控制器自然拿不到这两个变量,视图渲染时肯定会抛出「Undefined variable」的错误。

另外,方法里的$books = Book::find($id);是多余的代码,完全可以直接用Book::find($id)(或者更推荐findOrFail(),找不到数据时自动返回404)。

2. 控制器层无法获取未被返回的数据

控制器调用$this->books->edit($id)后,只拿到了图书数据,compact('books', 'authors', 'bookcases')里的authors和bookcases根本不存在,这是导致语法/运行错误的直接原因。

修复后的代码

修改BookRepository的edit方法

把需要的所有数据打包返回:

public function edit($id) { 
    $book = Book::findOrFail($id); // 找不到数据时抛出404,比find()更友好
    $authors = Author::all(); 
    $bookcases = Bookcase::all(); 
    return compact('book', 'authors', 'bookcases');
}

修改控制器的edit方法

接收Repository返回的全部数据,再传递给视图:

public function edit($id) { 
    // 直接把返回的数组传给视图,视图可以直接用$book、$authors、$bookcases变量
    return view('admin.books.edit', $this->books->edit($id));
}

或者如果你习惯拆分变量:

public function edit($id) { 
    ['book' => $book, 'authors' => $authors, 'bookcases' => $bookcases] = $this->books->edit($id); 
    return view('admin.books.edit', compact('book', 'authors', 'bookcases'));
}

小提示

视图里如果原来用的是$books(复数),建议改成$book(单数),因为这是单条图书数据,语义更准确。如果要保持变量名一致,把Repository里的$book改成$books就行。

内容的提问来源于stack exchange,提问作者user11124425

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:07