Я пытаюсь связать таблицу пользователей с user_info. Я нашел несколько сообщений об этом, и это работает, но у меня проблемы с автоинкрементом user_info-> id.
Если я установил: $ table-> приращения ('идентификатор');
Я получаю сообщение об ошибке, что значение по умолчанию не установлено, работает, только если я добавлю $ table-> integer ('id') -> обнуляемый ($ value = true);
Вот что у меня сейчас есть:
Модель пользователя
public function userinfo()
{
return $this->hasOne('App\Userinfo');
}
Модель Userinfo
public function user()
{
return $this->belongsTo('App\User');
}
Миграция / структура таблицы
public function up()
{
Schema::create('user_info', function (Blueprint $table) {
//There is a problem, if I don't add user_id it says that user_id doesnt exists, so I created user_id and decided to set id to autoincrement but it doesnt works so I made it like that
$table->integer('id')->nullable($value = true);
$table->foreign('id')->references('id')->on('users');
$table->integer('user_id');
$table->string('avatar',255)->default('notset.jpg')->nullable($value = true);
$table->string('looking_for',255)->nullable($value = true);
$table->string('steam_nick',40)->nullable($value = true);
$table->integer('age')->length(3)->nullable($value = true);
$table->integer('isFriendly')->length(2)->nullable($value = true);
$table->integer('isToxic')->length(2)->nullable($value = true);
$table->integer('isLeader')->length(2)->nullable($value = true);
$table->integer('isFunny')->length(2)->nullable($value = true);
$table->integer('isSkilled')->length(2)->nullable($value = true);
$table->text('description')->nullable($value = true);
$table->timestamps();
});
}
Наконец, UserinfoController
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
$userinfo = new Userinfo();
if ($userinfo->user_id == null ) {
$userinfo->steam_nick = $request->steam_nick;
$userinfo->looking_for = $request->looking_for;
$userinfo->description = $request->description;
$userinfo->avatar = $request->avatar;
$userinfo->age = $request->age;
$user->Userinfo()->save($userinfo);
} else {
$user->Userinfo()->update($input);
}
}
Phpmyadmin img
Все, что мне нужно, это установить id в user_info так же, как id у пользователей. Мне не нужен user_id, но я не могу заставить его работать по-другому, но я уверен, что это неправильно.






Ладно, давайте разберемся по частям.
Во-первых, мне нравится специально указывать столбец моей таблицы в качестве второго аргумента для любых 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().
Попробуйте и дайте мне знать, как это работает.
Вероятно, вы получаете ошибку, потому что не вставляется user_id. Вы получаете эту ошибку из примера кода контроллера, который я вам дал, или где-то еще?
Спасибо, сэр, теперь ясно, но мне интересно, почему я получаю ошибку, поскольку мы установили идентификатор пользователя SQLSTATE [HY000]: Общая ошибка: 1364 Поле user_id не имеет значения по умолчанию (SQL: вставить в
user_info(steam_nick,looking_for,description,avatar,age,updated_at,created_at) значения (asd, begginer, asd, ww3theme.jpg, 12, 2018-06-06 15:03:42, 2018-06-06 15:03:42))