PAYATHON 2026

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(),完整响应应是集合对应的数组;问题中展示的是其中一条记录的片段。如果接口需要单个关联对象,需要先明确如何选定某一本书。

备注:内容仅供参考。