Laravel скрывает или удаляет некоторые данные столбца базы данных из результата

в Laravel API у меня есть метод, который возвращает некоторые поля, которые я не хочу иметь в результате, например:

id  -  email  -  user_id

и они являются необязательными, и я не могу установить эти поля в собственные модели, теперь я использую этот класс как поля / столбцы от ManageResource до hode/remove из результата, подобного этому коду:

$user = User::whereApiToken($request->api_token)->first();
$result = ManageResource::make($user)->hide(['id','email']);

после использования этого кода, реализованного классом ниже, я получаю только id и email на ключах массива, но я хочу их скрыть

ManageResource класс:

namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;

class ManageResource extends Resource
{
    /**
     * @var array
     */
    protected $withoutFields = [];

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->filterFields($this->withoutFields);
    }

    /**
     * Set the keys that are supposed to be filtered out.
     *
     * @param array $fields
     * @return $this
     */
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }

    /**
     * Remove the filtered keys.
     *
     * @param $array
     * @return array
     */
    protected function filterFields($array)
    {
        return collect($array)->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 и хотите разрабатывать...
4
0
10 194
7

Ответы 7

Попробуй это:

   /**
     * Remove the filtered keys.
     *
     * @param $array
     * @return array
     */
    protected function filterFields($array)
    {
        return collect($array)->except($this->withoutFields)->toArray();
    }

Я получаю этот результат на выходе "data": ["id"], когда хочу скрыть id::make($user)->hide(['id'])

DolDurma 02.07.2018 08:50

В публичной функции toArray ($ request) {return $ this-> filterFields ($ this-> withoutFields); } следует вызвать метод с пользовательскими данными. return $ this-> filterFields ($ this-> userData) - или все, что вы сохраните при создании экземпляра ManageResource

user2693928 02.07.2018 09:21

Я делаю это по умолчанию, но получаю тот же результат

DolDurma 02.07.2018 14:23

вы можете использовать получать()

$result = new (ManageResource($user))->get(['name']);

он вернет только те значения, которые вам нужны.

я получаю эту ошибку: Method Illuminate\Database\Query\Builder::filter does not exist.

DolDurma 02.07.2018 08:52

ваш код неверен; это должен быть (new UsersResource($user))->get(['id','name']), и я хочу скрыть, чтобы не получать определенные столбцы

DolDurma 02.07.2018 09:27

Поскольку вы хотите скрыть некоторые обычно видимые атрибуты на данный экземпляр модели, вы можете использовать метод makeHidden.

return $user->makeHidden('attribute')->toArray();

Здесь $user представляет модель пользователя.

Пример случая: используйте makeHidden с кодом, чтобы скрыть столбец в результате разбивки на страницы

$result = Job::where('user_id','=',Auth::id())->paginate(5);
$data =$result;
$result= $result->makeHidden(['hasMessage']);
$data->data = $result;
return $data;

В твоем случае :

$result = ManageResource::make($user)->makeHidden(['id','email'])->toArray();
$data->data = $result;
return $data;

или же

$result = User::whereApiToken($request->api_token)->first()->setHidden(['id', 'email']);
$data->data = $result;
return $data;

Примечание :

Насколько мне известно, makeHidden не влияет на отношения. Было бы хорошо, если бы он позволял вам указывать атрибуты в отношениях как -makeHidden (['Relations.field']). В качестве альтернативы вы можете использовать следующий код

App\Models\Product::with(['images' => function ($query) {             
 $query->select(['id','product_id','image_url',   
'row_id'])->orderBy('created_at', 'desc');                            
}])->get()->makeHidden(['id']);

В твоем случае

$tickets = UserTickets::with(['user', 'reply' => function ($query) use ($user) {
    $query->with('user')->select(['id','Attrib1','Attrib2'])->whereUserId($user->id);
}])->whereTicketNumber($request->ticket_number)->get();

Спасибо, как насчет этой ссылки: https://stackoverflow.com/q/51131225/1830228 не могли бы вы мне помочь?

DolDurma 02.07.2018 09:41

Пожалуйста. Его страница не найдена по этой ссылке. Кажется, вы нашли решение, не так ли?

Amitesh Bharti 02.07.2018 09:49

как я могу использовать ваш код для вложенных данных? например вложенные данные внутри массива

DolDurma 02.07.2018 09:50

Согласно документации laravel, функция makeHidden () предназначена для скрытия атрибутов данной модели, что означает, что вы не получите ненужные данные в набор данных.

Amitesh Bharti 02.07.2018 09:53

Поделитесь этими строками кода, которые возвращают этот вложенный массив в качестве ответа.

Amitesh Bharti 02.07.2018 09:59

Извините, к сожалению, поскольку ->setHidden не работает с коллекцией или массивом, я пытаюсь исправить свой код, который я вставил в сообщение

DolDurma 02.07.2018 14:21

App \ Models \ Product :: with (['images' => function ($ query) {$ query-> select (['id', 'product_id', 'image_url', 'row_id']) -> orderBy (' created_at ',' desc ');}]) -> get () -> makeHidden ([' id ']);

Amitesh Bharti 02.07.2018 15:39

Извините за опоздание, ответ был немного занят. согласен -> setHidden не работает с отношением, но мы можем настроить его через -> select () в запросе отношения, передаются только те поля, которые вы хотите получить из таблицы отношений, проверьте мой обновленный комментарий для более подробной информации .. Я тестировал это на моей стороне .. это работает

Amitesh Bharti 02.07.2018 15:53

Большое спасибо, позвольте мне проверить это

DolDurma 02.07.2018 17:32

Это должно быть отмечено как правильный ответ, +1 @Amitesh

thechaoticpanda 02.12.2018 20:40

Вы можете использовать фильтр карты, чтобы получить нужные поля.

$events= Events::where(['id' => 1])->get()
            ->map(function ($event) {
                return [
                    'id' => $event->id,
                    'title' => $event->title,
                    'target' => $event->specific,
                    'date' => $event->start . '-' . $event->end,
                    'created' => $event->created_at
                ];
            });

Разве не проще всего использовать метод setHidden() на самой модели?

$user = User::whereApiToken($request->api_token)->first()->setHidden(['id', 'email']);

echo $user;

Учитывая структуру таблицы / поля id - email - user_id, это должно привести к чему-то вроде:

{"user_id": 1}
->setHidden работает только с определенными моделями, а не с массивом или коллекцией
DolDurma 02.07.2018 14:22

Я знаю. Но ваш класс ManageResource казался ненужным, если его задача заключалась только в удалении определенных полей из модели. Поскольку вы используете ->first(), вы получите только одну модель, на которой вы можете использовать ->setHidden(). Итак, я думаю, самое чистое решение для вашего примера.

Niklas 03.07.2018 14:49

некоторые данные в моем веб-приложении выводятся не из одной модели, я бы хотел разработать свой собственный класс и исправить проблемы, заранее спасибо

DolDurma 03.07.2018 17:37
User::select('name')->get();
User::select('name', 'email')->get();
User::all()->pluck('name'); // array

Вы можете добавить объяснение

oriadam 02.07.2018 09:52
$_SESSION['data'] = array();
   $rows= Product::with('category')->get()
        ->map(function ($rows) {
            array_push($_SESSION['data'],array(
                'id' => $rows->id,
                'title' => $rows->title,
                'price' => $rows->price,
                'photo' => $rows->price,
                'categorytitle' => $rows->category->title,
                'created_at' => $rows->getCreationDate(),
                'updated_at' => $rows->getUpdationDate(),

            ));
        });
   $data = $_SESSION['data'];
   unset($_SESSION['data']);
   return view("products")->with("result",$data);

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