Laravel DB关系

时间:2018-06-06 13:37:29

标签: laravel

我正在尝试将user表与user_info连接起来。我发现了一些关于它的帖子并且它有效,但我遇到了user_info-> id autoincrement的麻烦。

如果我将其设置为: $表 - >增量( 'ID');

我收到的错误是没有设置默认值,只有在我添加时它才有效 $ table->整数('id') - > nullable($ 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

我需要的是在user_info中将id设置为与用户中的id相同。我不需要user_id,但不能让它以其他方式工作,但我确定这是错误的。

1 个答案:

答案 0 :(得分:0)

好的,让我们一点一点地分解。

首先,我喜欢做的是明确声明我的表列是模型中任何hasOnebelongsTo的第二个参数。由于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变量中获取用户的ID,并且您已经抓取了所有必要的数据user_info表格并将其放在$input变量中,在创建用户的信息记录时,我们只需array_merge()这两个数组。

否则,如果相关记录已存在,我们只需使用我们的关系user_info更新->userinfo()记录。

尝试一下,让我知道它是如何工作的。