Laravel DB отношения - PullRequest
       3

Laravel DB отношения

0 голосов
/ 06 июня 2018

Я пытаюсь связать таблицу пользователей с user_info.Я нашел несколько сообщений об этом, и это работает, но у меня проблемы с автоинкрементом user_info-> id.

Если я установлю его в: $ table-> increments ('id');

Я получаю сообщение об ошибке, что никакое значение по умолчанию не установлено, оно будет работать, только если я добавлю $ table-> integer ('id') -> nullable ($ value = true);

Вот что я получил сейчас:

Модель пользователя

public function userinfo()
{
    return $this->hasOne('App\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

Все, что мне нужноустановить идентификатор в user_info так же, как идентификатор пользователя.Мне не нужен user_id, но я не смог заставить его работать по-другому, но я уверен, что это неправильно.

1 Ответ

0 голосов
/ 06 июня 2018

Хорошо, давайте разберем его по частям.

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

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

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