в 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();
}
}






Попробуй это:
/**
* Remove the filtered keys.
*
* @param $array
* @return array
*/
protected function filterFields($array)
{
return collect($array)->except($this->withoutFields)->toArray();
}
В публичной функции toArray ($ request) {return $ this-> filterFields ($ this-> withoutFields); } следует вызвать метод с пользовательскими данными. return $ this-> filterFields ($ this-> userData) - или все, что вы сохраните при создании экземпляра ManageResource
Я делаю это по умолчанию, но получаю тот же результат
вы можете использовать получать()
$result = new (ManageResource($user))->get(['name']);
он вернет только те значения, которые вам нужны.
я получаю эту ошибку: Method Illuminate\Database\Query\Builder::filter does not exist.
ваш код неверен; это должен быть (new UsersResource($user))->get(['id','name']), и я хочу скрыть, чтобы не получать определенные столбцы
Поскольку вы хотите скрыть некоторые обычно видимые атрибуты на данный экземпляр модели, вы можете использовать метод 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 не могли бы вы мне помочь?
Пожалуйста. Его страница не найдена по этой ссылке. Кажется, вы нашли решение, не так ли?
как я могу использовать ваш код для вложенных данных? например вложенные данные внутри массива
Согласно документации laravel, функция makeHidden () предназначена для скрытия атрибутов данной модели, что означает, что вы не получите ненужные данные в набор данных.
Поделитесь этими строками кода, которые возвращают этот вложенный массив в качестве ответа.
Извините, к сожалению, поскольку ->setHidden не работает с коллекцией или массивом, я пытаюсь исправить свой код, который я вставил в сообщение
App \ Models \ Product :: with (['images' => function ($ query) {$ query-> select (['id', 'product_id', 'image_url', 'row_id']) -> orderBy (' created_at ',' desc ');}]) -> get () -> makeHidden ([' id ']);
Извините за опоздание, ответ был немного занят. согласен -> setHidden не работает с отношением, но мы можем настроить его через -> select () в запросе отношения, передаются только те поля, которые вы хотите получить из таблицы отношений, проверьте мой обновленный комментарий для более подробной информации .. Я тестировал это на моей стороне .. это работает
Большое спасибо, позвольте мне проверить это
Это должно быть отмечено как правильный ответ, +1 @Amitesh
Вы можете использовать фильтр карты, чтобы получить нужные поля.
$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 работает только с определенными моделями, а не с массивом или коллекцией
Я знаю. Но ваш класс ManageResource казался ненужным, если его задача заключалась только в удалении определенных полей из модели. Поскольку вы используете ->first(), вы получите только одну модель, на которой вы можете использовать ->setHidden(). Итак, я думаю, самое чистое решение для вашего примера.
некоторые данные в моем веб-приложении выводятся не из одной модели, я бы хотел разработать свой собственный класс и исправить проблемы, заранее спасибо
User::select('name')->get();
User::select('name', 'email')->get();
User::all()->pluck('name'); // array
Вы можете добавить объяснение
$_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);
Я получаю этот результат на выходе
"data": ["id"], когда хочу скрытьid::make($user)->hide(['id'])