Как скрыть столбцы отношений в Laravel?

У меня есть такое утверждение:

App\User::with('client')->find(2)->makeHidden('client.phone_no');

Я хочу скрыть определенные столбцы от отношения, но я не могу сделать это с помощью makeHidden(), потому что он принимает только аргументы для Model, а не отношение.

Как я могу скрыть некоторые столбцы из отношения?

это ответ на API?

Leo 14.08.2018 15:20

Да, ответ на api @ Leorent

Tanmay 14.08.2018 15:21

В поисках дополнительной информации я также нашел метод это продуманный, но эффективный

Douwe de Haan 14.08.2018 15:29

Какие отношения у client?

Jonas Staudenmeir 14.08.2018 17:39

@JonasStaudenmeir hasOne

Tanmay 14.08.2018 18:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
5
12 269
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы не хотите скрывать phone_no для всех запросов, добавляя его в свойство hidden, вы можете сделать что-то вроде этого:

$user = App\User::with('client')->find(2);
$user->client->makeHidden('phone_no');
return $user;

Как я уже сказал в своем комментарии к исходному вопросу: я также нашел метод это. Я считаю, что это должен быть метод, который вы должны использовать, когда хотите чаще исключать столбцы. Если вы хотите исключить столбец только один раз, моего решения должно быть достаточно.

Я думаю, что это самый чистый подход, поскольку он не требует дополнительных запросов и не требует специальной области видимости. Однако, как указал @JonasStaudenmeir, вызов with() здесь избыточен.

Tanmay 15.08.2018 07:22

@Eisenheim Не совсем. Если вы собираетесь загрузить клиент, можете с таким же успехом загрузить его. Второй вызов client будет использовать уже загруженного клиента.

Douwe de Haan 15.08.2018 09:03

With принимает обратный вызов для изменения запроса.

$users = User::with(['client' => function($query) {
        $query->select(['id', 'name']);
    }])->find(2);

Вы также можете определить скрытые атрибуты по умолчанию в своей клиентской модели.

protected $hidden = ['phone_no'];

Возвращает null для клиента: client: null

Tanmay 14.08.2018 15:39

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

lagbox 14.08.2018 15:55

@lagbox Вы правы. Если я не укажу внешний ключ, я получу null. Но если я укажу FK, это действительно сработает: \App\User::with(['client' => function($query){$query->select(['user_id','name']);}])->fin‌​d(2); Но я не хочу раскрывать и user_id ...

Tanmay 15.08.2018 07:04

Вы можете создать scope в своей модели и применить его в конструкторе.

Определите эти функции в своей модели

protected function columns(){
    return Schema::getColumnListing('clients');
}

public function scopeExclude($query, $value = array()) 
{
  return $query->select( array_diff( $this->columns(), $value) );
}

Теперь используйте его в построителе запросов

App\User::with(['client' => function($query){
    $query->exclude(['phone_no']);
}])->find(2)

Вы можете либо скрыть столбец в результате запроса (активная загрузка не требуется):

$user = User::find(2);
$user->client->makeHidden('phone_no');

Или вы его даже не получаете из базы данных:

$user = User::with('client:id,user_id,...' /* other columns except phone_no */)->find(2);

Второй способ не работает. Возвращает null как значение client.

Tanmay 15.08.2018 06:55

Является ли user_id столбцом внешнего ключа в таблице clients? Вы включили его в выбранные столбцы?

Jonas Staudenmeir 15.08.2018 16:20

Вы не можете выбрать client без user_id, поэтому вам придется использовать ->makeHidden() или Client::$hidden.

Jonas Staudenmeir 16.08.2018 15:34

Другие вопросы по теме