Как исключить данные объединенной таблицы из результатов запроса - PullRequest
0 голосов
/ 05 июня 2019

Предположим, у меня есть следующий запрос,

$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 голосов
/ 05 июня 2019

Попробуйте выбрать после того, как вы присоединитесь, и, возможно, воспользуетесь простым оператором объединения?:

$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 (), или, возможно, вы не предоставили полный запрос.

Надеюсь, это поможет

0 голосов
/ 05 июня 2019

Я поставлю этот ответ здесь, так как я решил проблему, но я чувствую, что где-то есть лучший способ.Решение, по-видимому, полагается на то, что соединение является определенной связью в модели.Было бы неплохо иметь возможность исключить данные на уровне запроса.

Чтобы исключить данные из элементов в коллекции, можно использовать 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');

Надеюсь, это кому-нибудь поможет ...

0 голосов
/ 05 июня 2019

Простой трюк сделает: Внутри вашей модели использовать атрибут $ hidden = ['pageContent или любое другое имя вашего отношения к таблице']; Во время сериализации это отношение будет скрыто по умолчанию. Вы должны сделать его видимым, когда захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...