假设我有以下查询,
$results = Listing::select('listings.id', 'listings.slug', 'page_contents.html_title AS name')
->join('page_contents', function ($join) {
$join->on('page_contents.subject_id', '=', 'listings.id')
->where('page_contents.subject_type', '=', 'App\Listing');
})
->get();
$results
将包含指定的选择列(这是我所需要的),而且还将包含page_contents
的所有数据,
{
"id": 3,
"slug": "omnis-et-harum-atque",
"name": "Omnis et harum atque",
"page_content": {
"id": 3,
"subject_type": "App\\Listing",
"subject_id": 3,
"html_title": "Omnis et harum atque",
"meta_title": "Omnis et harum atque",
... and a load more stuff I don't want,
"created_at": "2019-05-23 09:16:37",
"updated_at": "2019-05-23 09:16:37"
}
}
如何从返回的数据中删除page_content
。正在为API返回数据,因此page_data
信息位于顶部。
Laravel 5.8
欢呼
答案 0 :(得分:0)
一个简单的技巧就可以做到: 在您的模型清单中: 使用属性$ hidden = ['pageContent或与表的关系的任何名称']; 序列化时,默认情况下将隐藏此关系。您必须在需要时使其可见。
答案 1 :(得分:0)
在加入后尝试选择并使用简单的加入语句?
$results = Listing::join('page_contents','page_contents.subject_id', '=', 'listings.id')
->where('page_contents.subject_type', '=', 'App\Listing')
->select('listings.id', 'listings.slug', 'page_contents.html_title AS name')
->get();
PS。我不知道您的查询如何在没有任何get()或first()调用的情况下返回结果,或者您可能没有提供完整的查询。
我希望对您有帮助
答案 2 :(得分:0)
我将这个答案放在这里,因为这是我解决问题的方式,但是我觉得有更好的方法隐藏在某处。解决方案似乎依赖于联接是模型上已定义的关系。能够在查询级别排除数据会很好。
要从集合中的项目中排除数据,可以使用makeHidden()
。
$results = Listing::select('listings.id', 'listings.slug', 'page_contents.html_title AS name')
->join('page_contents', function ($join) {
$join->on('page_contents.subject_id', '=', 'listings.id')
->where('page_contents.subject_type', '=', 'App\Listing');
})
->get();
$results->makeHidden('pageContent');
如果使用->paginate($size)
代替->get()
,则
$results->getCollection()->makeHidden('pageContent');
希望可以帮助某人...