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
相关产品推荐
相关产品推荐

