Laravel 如何只返回 hasOne 关联数据?
数据阿明
查询完成后,可以用 Collection 的 pluck('getBook') 提取关联对象,再返回 JSON。原查询使用 get(),可能查到多条 Book,因此结果是由关联对象组成的数组。
修改控制器代码
public function getBookCover()
{
$bookCovers = Book::with('getBook')
->get()
->pluck('getBook')
->filter(function ($bookCover) {
return $bookCover !== null;
})
->values();
return response()->json($bookCovers);
}
这段代码去掉了外层 Book 字段和 get_book 包装层,只保留关联的 BookCover 对象。没有匹配的关联数据时,返回空数组 []。
为什么 with() 仍会返回 Book 字段?
Book::with('getBook')->get() 的查询主体是 Book。with() 负责预加载关联,返回的集合元素仍是 Book 实例,每个实例都带有已加载的 getBook 关联。
这里的 pluck() 在 get() 之后执行,操作的是内存中的集合,用来提取每个 Book 的关联对象。
为什么使用 getBook,而不是 get_book?
关联方法名是 getBook(),所以预加载和访问模型关联时使用 getBook:
Book::with('getBook')->get();
$book->getBook;
示例 JSON 中的 get_book 是关联序列化后的字段名。此处 pluck() 操作的仍是模型对象,应写成 pluck('getBook')。
空关联和数组索引怎么处理?
hasOne 没有匹配记录时,关联值通常为 null。示例中的 filter() 会移除这些空值;如果需要保留每本书对应的位置,可以去掉这一步。
过滤后的集合可能保留不连续的数字键。values() 会重新生成连续索引,确保结果按 JSON 数组输出。
原代码调用的是 get(),完整响应应是集合对应的数组;问题中展示的是其中一条记录的片段。如果接口需要单个关联对象,需要先明确如何选定某一本书。
备注:内容仅供参考。
