Отношения с БД Laravel

Я пытаюсь связать таблицу пользователей с 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, но я не могу заставить его работать по-другому, но я уверен, что это неправильно.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ладно, давайте разберемся по частям.

Во-первых, мне нравится специально указывать столбец моей таблицы в качестве второго аргумента для любых 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().

Попробуйте и дайте мне знать, как это работает.

Спасибо, сэр, теперь ясно, но мне интересно, почему я получаю ошибку, поскольку мы установили идентификатор пользователя 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))

riten 06.06.2018 17:04

Вероятно, вы получаете ошибку, потому что не вставляется user_id. Вы получаете эту ошибку из примера кода контроллера, который я вам дал, или где-то еще?

Mark 06.06.2018 18:08

Другие вопросы по теме