Как сохранить массив через foreach
Я делаю авторизацию через Discord, и мне нужно сохранить сервера на которых находится участник.
public function login(Request $request) {
if (Auth::check()) {return redirect()->route("main.index");};
if ($request->missing("code") && $request->missing("access_token")) {return redirect()->route("main.index");};
$this->tokenData["client_id"] = env("DISCORD_CLIENT_ID");
$this->tokenData["client_secret"] = env("DISCORD_CLIENT_SECRET");
$this->tokenData["code"] = $request->get("code");
$this->tokenData["redirect_uri"] = env("DISCORD_REDIRECT_URI");
$client = new GuzzleHttp\Client();
try {
$accessTokenData = $client->post($this->tokenURL, ["form_params" => $this->tokenData]);
$accessTokenData = json_decode($accessTokenData->getBody());
} catch (\GuzzleHttp\Exception\ClientException $error) {
return redirect()->route("main.index");
};
$userData = Http::withToken($accessTokenData->access_token)->get($this->apiURLBase);
if ($userData->failed()) {return redirect()->route("main.index");};
$guildData = Http::withToken($accessTokenData->access_token)->get($this->apiURLBase . '/guilds');
if ($guildData->failed()) {return redirect()->route("main.index");};
$userData = json_decode($userData);
$guildData = json_decode($guildData);
foreach(...)
Как мне это сделать через foreach? Не очень догоняю как это реализовать
---Изменил--- Пытался добавить так, но потом уже понял что нужно через foreach, посмотрел примеры, так и не понял как это реализовать
$guild = Guild::updateOrCreate(
[
'id' => $guildData -> id,
],
[
'name' => $guildData -> name,
'icon' => $guildData -> icon,
'owner' => $guildData -> owner,
'permissions' => $guildData -> permissions,
'features' => $guildData -> features,
'permissions_new' => $guildData -> permissions_new
]
);
Ответы (1 шт):
Автор решения: Sanya H
→ Ссылка
Вариант 1. В модели Guild добавляем следующее (для автоматического преобразования сериализированного массива в массив при обращении к полю модели)
protected $casts = [
'features' => 'array',
];
Код сохранения. Вместо $guildData = json_decode($guildData); пишем
$guildData = $guildData
->collect() // преобразуем в коллекцию для удобства обработки
->map(function($guild) {
// сериаллизируем массив
$guild['features'] = json_encode($guild['features']);
return $guild;
})->toArray();
/* код выше можно и так записать, чтобы не делать коллекцию
$guildData = array_map(function ($guild) {
$guild['features'] = json_encode($guild['features']);
return $guild;
}, $guildData->json());
*/
Guild::upsert($guildData, ['id']);
Вариант 2. С циклом, если реализовано через отношение features
foreach ($guildData->json() as $guild) {
$features = $guild['features']; // сохраняем список
unset($guild['features']); // удаляем с текущего набора (очистка для updateOrCreate)
$entry = Guild::updateOrCreate(
$guild,
['id' => $post['id']]
);
// находим ID всех features (подразумевается, что таблица и модель features
// создана, а модель Guild связана с нею отношением многие-ко-многим)
$feature_ids = Feature::whereIn('feature', $features)->pluck('id');
// обновляем полученные features в текущей модели Guild
$entry->features()->sync($feature_ids);
}
П.С. Код писал в блокноте, поэтому возможны опечатки