Laravel 5.6中使用with()关联查询时如何仅选择所需字段?
解决Laravel 5.6关联查询仅选择指定字段的问题
这事儿好办!在Laravel里要实现你要的指定字段查询,核心就是在主模型和关联模型里分别指定需要的字段,但有个关键细节不能忘:必须包含关联所需的键,不然关联关系会失效。
直接上修改后的代码,两种写法都给你:
写法一:闭包方式(更灵活,适合复杂关联逻辑)
foreach(Book::select('book_name', 'book_description', 'author_id') ->with(['author' => function($query) { $query->select('id', 'author_name'); }])->get() as $book) { echo $book->author->author_name; }
写法二:简洁写法(Laravel 5.5+支持)
foreach(Book::with('author:id,author_name') ->select('book_name', 'book_description', 'author_id') ->get() as $book) { echo $book->author->author_name; }
关键细节解释
为什么要多写author_id(Book表)和id(Author表)?
- Laravel需要通过
books.author_id和authors.id这两个字段来匹配对应的书和作者,如果没选这两个字段,框架没法建立关联,你会发现$book->author变成null。 - 加上这两个必要字段后,生成的SQL就完全符合你的需求了:
select book_name, book_description, author_id from booksselect id, author_name from authors where id in (1, 2, 3, ...)
这样既实现了只查需要的字段,又保证了关联关系正常工作~
内容的提问来源于stack exchange,提问作者Mȍhǟmmǟd Șamȋm
相关产品推荐
相关产品推荐

