Как хранить и редактировать несколько данных в один столбец JSON? - PullRequest
0 голосов
/ 11 января 2019

У меня есть профиль модели, который принадлежит модели пользователя. Модель профиля имеет один «информационный» столбец JSON, в котором хранится много данных, таких как личная информация, рабочая информация, контактная информация и т. Д. Вот структура поля JSON, но в рабочей области будет несколько данных, например, опыт работы , текущая работа и т. д.

До сих пор мне удавалось хранить только одну рабочую информацию и показывать в блейд-файле. Но мне нужно хранить несколько рабочих данных.

Вот как выглядит поле JSON:

 {"work": {"info": "work", "company": "Augnitive", "working_to": null,
    "designation": "Software Engineer", "working_from": "2019-01-14", 
    "responsibilities": null}, "contact": {"info": "contact", "email": 
    "ki.tushar21@gmail.com", "mobile": "01681654863", "address": "House 156, 
    Sultangonj, Rayer Bazar Dhaka 1209, West Agargaon, West Agargaon", 
    "facebook": "fb.com", "linkedin": "linkedin.com", "citizenship": 
    "Bangladesh"}, "personal": {"bday": "2019-01-07", "info": "personal", 
    "blood": "A(+VE)", "gender": "Male"}, "education": {"info": "education", 
    "edu_type": "SSC", "institute": "svf", "graduation": "2010"}}

Вот как я храню данные в моем контроллере:

protected $info_mapping = [
    'work' => 'work',
    'education' => 'education',
    'contact' => 'contact',
    'personal' => 'personal'

];

public function store(Request $request)
{
    $type = $request->get('info');
    $name = $request->get('name');
    if (isset($name)) {
        $user = Auth::user();
        $user->name = $request->get('name');
        $user->student_id = $request->get('student_id');
        $user->save();
    }

    if (!isset($this->info_mapping[$type])) {
        return response()->json([
            'error' => true,
            'message' => "Type is invalid",
        ]);
    }
    $form_data = $request->except('name', '_token', 'student_id');
    $profile = auth()->user()->profile;
    $data = [];
    if (isset($profile->information)) {
        $data = $profile->information;
    }
    $data[$this->info_mapping[$type]] = $form_data;
    $profile->information = $data;
    $profile->save();

    return redirect()->back();
}

Из моего файла Blade я передаю скрытое поле ввода, чтобы проследить, из какой формы поступают данные, например:

 <input name="info" value="work" hidden>
    <div class="form-group">
        <label class="col-md-4 control-label">Designation</label>
        <div class="col-md-6 inputGroupContainer">
            <div class="input-group {{ $errors->has('designation')?'has_error':'' }}">
                <span class="input-group-addon"><i class="glyphicon glyphicon-briefcase"></i></span>
                <input name="designation" placeholder="Designation" class="form-control" type="text" required>
                @include('errors.form',['field' => 'designation'])
            </div>
        </div>
    </div>
...