Получить и обновить массивы JSON - PullRequest
0 голосов
/ 27 апреля 2018

В приложении Laravel я храню сведения о пользователе в другой таблице с именем profiles, и я решил, что было бы неплохо сохранить один столбец в виде простого массива JSON.

Этот столбец называется socialProfiles

Вот мой метод индекса ProfilesController

public function index()
{
    $user = auth()->user(); 

    if($user)
    {
        $profile = $user->profile;

        if(!$profile)
        {

            // Define the social profiles array
            $socialProfiles = [
                'Facebook' => '',
                'Twitter' => ''
            ];

            $profile = new Profile();
            $profile->user_username = $user->username;
            $profile->mangedByUsername = $user->managedByUsername;
            $profile->socialProfiles = json_encode($socialProfiles);

            $profile->save();
        }

        $socialProfiles = json_decode($user->profile->socialProfiles, true);

        return view('editable.people.profile', compact('user', 'socialProfiles'));
    }

}

Я устанавливаю значения по умолчанию ничего для Facebook и Twitter и кодирую их в виде строки JSON, затем возвращаю пользователя и профили в представление.

В представлении у меня есть отдельные формы (внутри модальных), которые обновляют различные части профиля пользователя, и все они используют один и тот же метод, поэтому моя функция обновления выглядит следующим образом:

public function update(Request $request)
{
    // TODO: Add validation before updating or adding the profile
    $this->validate(request(), [
        'background' => 'min:1',
        'skills' => 'min:1',
    ]);

    $user = auth()->user();

    if($user)
    {
        // Only proceed if there is a logged in user
        $profile = $user->profile;

        // If there is no profile, create one for this user as they'll need one.
        if (!empty(request()->get('background')))
        {
            $profile->background = $request->get('background');
        } 

        if (!empty(request()->get('skills')))
        {
            $profile->skills = $request->get('skills');
        }

        if (!empty(request()->get('filepath')))
        {
            $profile->displayPicture = $request->get('filepath');
        }

        $profile->user_username = $user->username;

        $profile->save();

        return redirect()->back()->withSuccess('Your profile has been successfully updated');;
    }
}

Если я собираюсь обновить массив JSON социального профиля, потребуется ли мне пересоздать массив, закодировать его и затем сохранить?

Причиной отдельных модальностей является то, что дизайн выглядит следующим образом:

enter image description here

enter image description here

Должно ли у меня быть много отдельных методов обновления?

1 Ответ

0 голосов
/ 27 апреля 2018

Какая у вас система СУБД, вы используете колонку Postgres JSON?

Если вы сохраняете это так $profile->socialProfiles = json_encode($socialProfiles);

Вы сохраняете его как JSON, и это нормально. Но если вам нужно обновить его, у вас есть два варианта, изменить исходный столбец JSON с некоторыми добавлениями или создать новый столбец socialProfileUpdates, создать в нем новую запись JSON с обновленными ссылками профиля. Я не буду рекомендовать изменять исходную запись JSON каждый раз, когда пользователь обновляет запись, потому что таким образом ваша система будет действительно глючить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...