如何从查询结果中排除联接的表数据

时间:2019-06-05 10:38:41

标签: laravel laravel-5

假设我有以下查询,

$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

欢呼

3 个答案:

答案 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');

希望可以帮助某人...