У меня есть такое утверждение:
App\User::with('client')->find(2)->makeHidden('client.phone_no');
Я хочу скрыть определенные столбцы от отношения, но я не могу сделать это с помощью makeHidden(), потому что он принимает только аргументы для Model, а не отношение.
Как я могу скрыть некоторые столбцы из отношения?
Да, ответ на api @ Leorent
В поисках дополнительной информации я также нашел метод это продуманный, но эффективный
Какие отношения у client?
@JonasStaudenmeir hasOne






Если вы не хотите скрывать phone_no для всех запросов, добавляя его в свойство hidden, вы можете сделать что-то вроде этого:
$user = App\User::with('client')->find(2);
$user->client->makeHidden('phone_no');
return $user;
Как я уже сказал в своем комментарии к исходному вопросу: я также нашел метод это. Я считаю, что это должен быть метод, который вы должны использовать, когда хотите чаще исключать столбцы. Если вы хотите исключить столбец только один раз, моего решения должно быть достаточно.
Я думаю, что это самый чистый подход, поскольку он не требует дополнительных запросов и не требует специальной области видимости. Однако, как указал @JonasStaudenmeir, вызов with() здесь избыточен.
@Eisenheim Не совсем. Если вы собираетесь загрузить клиент, можете с таким же успехом загрузить его. Второй вызов client будет использовать уже загруженного клиента.
With принимает обратный вызов для изменения запроса.
$users = User::with(['client' => function($query) {
$query->select(['id', 'name']);
}])->find(2);
Вы также можете определить скрытые атрибуты по умолчанию в своей клиентской модели.
protected $hidden = ['phone_no'];
Возвращает null для клиента: client: null
в зависимости от того, как настроены эти отношения, вы можете не выбирать `` ключ '', который связывает эти модели ... если клиент принадлежит пользователю, вам нужно будет выбрать этот внешний ключ
@lagbox Вы правы. Если я не укажу внешний ключ, я получу null. Но если я укажу FK, это действительно сработает: \App\User::with(['client' => function($query){$query->select(['user_id','name']);}])->find(2); Но я не хочу раскрывать и user_id ...
Вы можете создать 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.
Является ли user_id столбцом внешнего ключа в таблице clients? Вы включили его в выбранные столбцы?
Вы не можете выбрать client без user_id, поэтому вам придется использовать ->makeHidden() или Client::$hidden.
это ответ на API?