![](/img/trans.png)
[英]Error: Integrity constraint violation: 1052 when Join in Laravel Eloquent
[英]Laravel 5.6 Eloquent integrity constraint violation when saving quiz record
我目前正在使用Laravel 5.6开发测验应用程序,并且在保存新测验记录时遇到了麻烦。
插入的两个表是quizzes
和user_quizzes
。 quizzes
表包含一些基本测验数据,例如:
user_quizzes
表包含两个外键,以引用哪个测验属于特定用户。
当插入到user_quizzes
表中时,该错误是违反完整性约束的。 它成功插入quiz_id
但user_id
保留为NULL。 我不确定如何确保在使用Eloquent时也插入了user_id
。
完整的错误是:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null (SQL: insert into `user_quizzes` (`quiz_id`, `user_id`) values (6, ))
我正在使用QuizController
, Quiz Model
和User Model
来保存记录。 这是我在QuizController
中的store()
方法:
public function store(Request $request)
{
$validator = $request->validate([
'quiz_name' => 'required|max:30',
'quiz_description' => 'required|max:500'
]);
$quiz = new Quiz(
[
'quiz_name' => $request->get('quiz_name'),
'quiz_description' => $request->get('quiz_description'),
'active' => '0',
'quiz_pin' => '5555', // hard coded for now
]
);
$quiz->save();
$user = new User;
$user->quizzes()->save($quiz);
return redirect()->route('quiz_host.dashboard.manage-quizzes')->with('quizCreated', 'Whoa ' . Auth::user()->username . ', you have created a quiz! Now it\'s time to add some questions');
}
我的User
模型如下:
<?php
namespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function activation()
{
return $this->hasOne('App\Models\Activation');
}
public function profile()
{
return $this->hasOne('App\Models\Profile');
}
public function quizzes()
{
return $this->belongsToMany(Quiz::class, 'user_quizzes', 'user_id', 'quiz_id');
}
}
和我的Quiz
模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Quiz extends Model
{
protected $table = 'quizzes';
protected $fillable = ['quiz_name', 'quiz_description', 'active', 'quiz_pin'];
public function user()
{
return $this->belongsToMany(User::class, 'user_quizzes', 'quiz_id', 'user_id');
}
}
关于我在做什么错的任何指导将不胜感激。
这是您的控制器:
QuizController.php
public function store(Request $request)
{
// your validations.
// Storing the quiz.
$quiz->save();
// User instance.
$user = new User;
// Storing the relationship.
$user->quizzes()->save($quiz);
// Returning the view.
return redirect()->route('quiz_host.dashboard.manage-quizzes')->with('quizCreated', 'Whoa ' . Auth::user()->username . ', you have created a quiz! Now it\'s time to add some questions');
}
现在,这里的问题与$user
对象有关。
执行此操作时:
$user = new User;
您正在创建User
类的实例,但是该对象尚未持久保存到数据库中,这意味着该对象还没有id
。 您可以通过dd($user->id)
来确认,这将返回null
。
这就是为什么当您这样做时:
$user->quizzes()->save($quiz);
它将引发SQL错误,因为您正在调用将$user
对象的$primaryKey
( id
)存储在数据透视表中的方法。 但是考虑到$user
对象没有主键,它试图存储一个null
值。
现在,我真的不知道您的“用例”是什么,但我将假定$user
是已登录的$user
,因此要正确关联该关系,请替换为:
// creating a User instance.
$user = new User;
有了这个:
// Logged-in user.
$user = auth()->user();
这将使用authfacade获取实际的登录用户并返回对象。 鉴于该用户是注册用户,因此将具有正确的id
。
如果您的用例不同,则将测验与其他用户相关联,请执行以下操作:
// Some other user
$user = User::find($someId); // $user = User::find(5); for example
或创建一个全新的User
实例并将测验与之关联:
// A new User
$user = new User;
$user->fill($someData);
$user-save(); // this will assign a primary key (id) to the object.
现在,您可以将相关模型附加到它。
您的users m--------m quizzes
是多对多关系 。
因此,如文档所述,在两个对象之间存储关系的正确方法是attach()
方法:
$user->quizzes()->attach($quiz->id);
此方法将使用$user
和$quiz
对象的ID在中间表(数据透视表)中创建一条记录。
为了明确起见, new User
将仅创建用户模型对象,但仍未提交给DB。
当我们尝试调用$user->quizzes()->save($quiz)
,它将尝试在user_quizzes数据透视表中添加一个条目,但是user_id为空,因为仍未创建用户。
因此,必须先在数据库中通过调用$user->save()
创建用户条目,然后才能将其添加到数据透视表中。
$quiz->save();
$user = new User;
$user->save();
$user->quizzes()->save($quiz);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.