Переместите Laravel с помощью() массива Json в родительский массив Json

#php #json #laravel #eloquent

#php #json #ларавель #красноречивый

Вопрос:

Я использую этот код для получения данных.

 $user = User::where('active', 1)-gt;with(['spots:spot_name,spot_uid'])-gt;get();  

Это отлично работает! Он получает взаимосвязь и выводит данные.

Однако данные выглядят так.

 user_uid: 5 spots: {spot_name: 'backend'} description: "Test user works in helpdesk" department: "9"  

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

 spots: "backend"  

Я знаю, что это потому, что он получает 2 столбца, а затем у меня есть один скрытый.

Неужели это невозможно, или я просто делаю это неправильно? Любая информация была бы великолепна.

Комментарии:

1.Что, если spots вернет две записи, например spots: [{spot_name: 'front_end'}, {spot_name: 'backend'}] ? spots Или hasOne() belongsTo() это отношения или? Если это так, то он назван неудачно; так и должно быть spot . Кроме того, $user является неправильным именем переменной для -gt;get() , которое возвращает несколько User экземпляров; рассмотрите возможность переименования в $users .

2. Извините, что эти имена были сокращены и изменены для публикации, так как они были довольно длинными. Однако он называется spots, потому что в этом примере таблица является spots, но возвращается на основе spot_uid. Таким образом, он может вернуть только один. Ваша жалоба на то, что json показывает пятна, — это то, что я хочу удалить. В этом-то и проблема. Я также хочу удалить пятна имен из исходящего json. Просто оставляю это имя 1 места.

Ответ №1:

Ты можешь это сделать

 User::where('active', 1)-gt;withCount(['spots as spot_name' =gt; function ($q) {  $q-gt;select('spot_name');  }]);  

выход

 {  ...  spot_name: 'backend'  }  

Ответ №2:

Вы можете форматировать выходные данные с помощью коллекций:

 $user-gt;map(function ($x) {  $arr = $x-gt;toArray();  $arr['spots'] = $arr['spots'][0]['spot_name'];  return $arr; });  

А затем вышел этот пользователь.

Комментарии:

1. Этот код не будет работать. Что находится $user в закрытии?

2. Моя вина. Исправлено @miken32

3. Спасибо! Я думаю, что это тоже должно сработать!