我正在尝试将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,但不能让它以其他方式工作,但我确定这是错误的。
答案 0 :(得分:0)
好的,让我们一点一点地分解。
首先,我喜欢做的是明确声明我的表列是模型中任何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
变量中获取用户的ID,并且您已经抓取了所有必要的数据user_info
表格并将其放在$input
变量中,在创建用户的信息记录时,我们只需array_merge()
这两个数组。
否则,如果相关记录已存在,我们只需使用我们的关系user_info
更新->userinfo()
记录。
尝试一下,让我知道它是如何工作的。