Скрыть отношения в запросе Laravel Eloquent

Мне нужно ваше предложение о лучшем способе скрыть информацию из массива отношений.

$members = User::with('profile')->paginate(9);

$members->makeHidden([
    'slug', 'profile.avatar'
]);

dd($members->toArray());

Этот код не скрывает информацию из массива профилей.

Спасибо

Стоит ли изучать 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 и хотите разрабатывать...
2
0
1 530
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

makeHidden не поддерживается для свойств отношения, только для всей связи. Вместо этого возьмите то, что хотите:

$member = User::with(['profile' => $function($query) {
    $query->select('id', 'user_id', 'about');
}])->paginate(9);

Вышеупомянутое, например, даст вам только поля id, user_id и about.

Редактировать

Если вы используете 5.6, вы также можете определить столбцы как строку, разделенную запятыми:

$member = User:with('profile:id,user_id,about')->paginate(9);

Я пробовал этот подход. Он возвращает профиль как нулевой

seoppc 07.06.2018 00:10

@seoppc Я забыл user_id. Обновлено.

Ohgodwhy 07.06.2018 00:11

SQLSTATE [42703]: неопределенный столбец: 7 ОШИБКА: столбец «id, user_id, about» не существует

seoppc 07.06.2018 00:15

select принимает массив, добавляет [ и ] вокруг столбцов.

Devon 07.06.2018 00:16

@seoppc Ура, похоже, у вас concatenated все столбцы в виде строки, например 'id, user_id, about' вместо 'id', 'user_id', 'about'

Ohgodwhy 07.06.2018 00:16

@Devon Нет необходимости с ->select() только с ->get()

Ohgodwhy 07.06.2018 00:18

Кажется, это работает, но теперь я не могу получить доступ к мутаторам. Это действительно проблема :(

seoppc 07.06.2018 00:21

Спасибо за вашу быструю помощь. Он работает для мутаторов с параметром $ value, но не для следования public function getFullNameAttribute() { return "{$this->first_name} {$this->last_name}"; }.

seoppc 07.06.2018 00:35

@seoppc Вы хотите сказать, что getFullNameAttribute перестает работать на вашем User?

Ohgodwhy 07.06.2018 00:56

Он не включается в вывод JSON - да, я использую Laravel 5.6

seoppc 07.06.2018 01:18

Добавьте их в свою модель.

* При скрытии отношений используйте имя метода отношения.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = ['password'];
}

Это исправит вас

https://laravel.com/docs/5.6/eloquent-serialization#hiding-attributes-from-json

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