首页 > 解决方案 > 如何从查询结果中排除联接表数据

问题描述

假设我有以下查询,

$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信息超出了顶部。

拉拉维尔 5.8

干杯

标签: laravellaravel-5

解决方案


我将把这个答案放在这里,因为这就是我解决问题的方法,但我觉得有更好的方法隐藏在某个地方。该解决方案似乎依赖于连接是模型上定义的关系。能够在查询级别排除数据会很好。

要从集合中的项目中排除数据,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');

希望对某人有所帮助...


推荐阅读