Хорошо, давайте разберем его по частям.
Во-первых, я хотел бы конкретно объявить, что мой столбец таблицы является вторым аргументом для любых hasOne
и belongsTo
в модели,В этом нет особой необходимости, поскольку Laravel использует магию вуду, чтобы угадать, как называется таблица - но я рекомендую это, потому что это делает отношения очень ясными.Итак, я бы сделал это для пользовательской модели:
public function userinfo()
{
return $this->hasOne('App\Userinfo', 'user_id'); // it references user_id on your user_info table.
}
Далее, давайте посмотрим на вашу user_info
миграцию.У вас были проблемы с вашим первичным ключом id
, потому что вы пытались установить его как integer
, когда он должен быть increments
.Мы настроим первые три строки:
$table->increments('id')->unsigned();
$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users'); // foreign references the user_id field in this table, since that's what's making the connection between users and users_info, we point back to the user's id
На данный момент, если вы можете, я рекомендую php artisan migrate:fresh --seed
.Это может помочь с любыми странными структурами баз данных, которые у вас были ранее.Это необязательно, хотя.Вы можете попробовать, если это не сработает сразу.
Теперь в контроллере я заметил, что вы ранее ссылались на $user->Userinfo()->update($input);
, но вы назвали отношение userinfo()
в своей пользовательской модели.Вероятно, это одна из тех вещей, которая вызывала у вас проблему.Они должны совпадать.Попробуйте настроить свой контроллер следующим образом:
public function update(Request $request, $id)
{
$user = User::findOrFail($id); //Get role specified by id
$this->validate($request, [
'steam_nick'=>'max:120',
'looking_for'=>'required',
'avatar'=>'',
'description'=>'max:450',
'age'=>'min:2'
]);
$input = $request->only(['steam_nick', 'looking_for', 'description','avatar','age']); //Retreive the name, email and password fields
// Does this user have an info record? If not, create it, else update it.
if (is_null($user->userinfo)) {
// Since you already collected the data in the $input variable, we simply array_merge it with the user's id
Userinfo::create(array_merge([
'user_id' => $user->id,
], $input));
} else {
$user->userinfo()->update($input);
}
return redirect()->back();
}
Итак, в основном мы проверяем, есть ли у пользователя соответствующая запись в таблице user_info
.Если нет, создайте его с данными.Если это так, просто обновите его.Поскольку в нашей миграции мы объявляем, что user_id
не может быть нулевым, мы должны извлечь идентификатор пользователя из переменной $user
, и вы уже собрали все необходимые данные для таблицы user_info
и поместили их в$input
переменная, мы просто array_merge()
эти два массива при создании информационной записи пользователя.
В противном случае, если связанная запись уже существует, мы просто обновляем запись user_info
, используя наши отношения ->userinfo()
.
Попробуйте и дайте мне знать, как это работает.