[英]Laravel Eloquent Relationships - Integrity constraint violation
我有3个模型:优先级,任务和用户
优先
代码...
class Priority extends Model
{
protected $fillable = ['name', 'hexcolorcode'];
protected $casts = [
'user_id' => 'int',
];
public function task()
{
return $this->hasMany(Task::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
任务
代码...
class Task extends Model
{
protected $fillable = ['name'];
protected $casts = [
'user_id' => 'int',
];
public function user()
{
return $this->belongsTo(User::class);
}
public function priority()
{
return $this->hasOne(Priority::class);
}
}
用户
代码...
class User extends Authenticatable
{
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
public function tasks()
{
return $this->hasMany(Task::class);
}
public function priorities()
{
return $this->hasMany(Priority::class);
}
}
TaskController
class TaskController extends Controller
{
protected $tasks;
private $priorities;
public function __construct(TaskRepository $tasks, PriorityRepository $priorities)
{
$this->middleware('auth');
$this->tasks = $tasks;
$this->priorities = $priorities;
}
public function index(Request $request)
{
return view('tasks.index', [
'tasks' => $this->tasks->forUser($request->user()),
'priorities' => $this->priorities->forUser($request->user())
]);
}
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:255',
'description' => 'required',
'priority' => 'required'
]);
$request->user()->tasks()->create([
'name' => $request->name,
'description' => $request->description,
'priority_id' => $request->priority
]);
return redirect('/tasks');
}
public function edit(Task $task)
{
$this->authorize('edit', $task);
return view('tasks.edit', compact('task'));
}
public function update(Request $request, Task $task)
{
$this->validate($request, [
'name' => 'required|max:255',
]);
$task->update($request->all());
return redirect('/tasks');
}
public function destroy(Request $request, Task $task)
{
$this->authorize('destroy', $task);
$task->delete();
return redirect('/tasks');
}
}
错误
现在,当我想存储任务时,它给了我以下错误:
SQLSTATE [23000]:违反完整性约束:1452无法添加或更新子行:外键约束失败(
tasks
。tasks
,CONSTRAINTtasks_priority_id_foreign
FOREIGN KEY(priority_id
)参考priorities
(id
))(SQL:插入tasks
(name
,user_id
,updated_at
,created_at
)值(测试任务,2016年1月1日,2016-05-01 14:11:21,2016-05-01 14:11:21))
这种结构是否可能,或者我必须在优先级表和任务表之间使用多态关系?
我的桌子
数据库模型图片: http : //picpaste.de/mysql-kBH4tO5T.PNG
class CreatePrioritiesTable extends Migration
{
public function up()
{
Schema::create('priorities', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->char('name');
$table->char('hexcolorcode', 7);
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users');
});
}
}
class CreateTasksTable extends Migration
{
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('name');
$table->text('description');
$table->integer('priority_id')->unsigned();
$table->timestamps();
$table->foreign('priority_id')->references('id')->on('priorities');
$table->foreign('user_id')->references('id')->on('users');
});
}
}
更新
优先控制器
class PriorityController extends Controller
{
protected $priorities;
public function __construct(PriorityRepository $priorities)
{
$this->middleware('auth');
$this->priorities = $priorities;
}
public function index(Request $request)
{
return view('priority.index', [
'priorities' => $this->priorities->forUser($request->user()),
]);
}
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:255',
'hexcolorcode' => 'required|max:7'
]);
$request->user()->priorities()->create($request->all());
return redirect('/priorities');
}
public function edit(Priority $priority)
{
$this->authorize('edit', $priority);
return view('priority.edit', compact('priority'));
}
public function update(Request $request, Priority $priority)
{
$this->validate($request, [
'name' => 'required|max:255',
'hexcolorcode' => 'required|max:7'
]);
$priority->update($request->all());
return redirect('/priorities');
}
public function destroy(Request $request, Priority $priority)
{
$this->authorize('destroy', $priority);
$priority->delete();
return redirect('/priorities');
}
}
在您的存储方法中。 它说的创建方法:
user-> tasks()。 该位将仅在用户和任务表中插入数据。 这就是为什么您有外键错误。 由于您不更新其中一个表(优先级),而且还向表中添加了外键,如我从迁移中看到的那样。
如果您有一个名为task_user的数据透视表,其中有userid,taskid和priority_id,那么您要实现的目标是正确的。 这将是完美的,因为您只需使用userid和taskid更新优先级列即可。 那是一种方法,但是它几乎不需要更改,或者您可以将数据分别插入到用户表和任务表中,而您只需要更改查询即可。 你喜欢哪个? 我可以给你看一个你喜欢的例子。
//for Priority
// store
$priorities = new Priority;
$priorities->name = Input::get('priority_name');
$priorities->hexcolorcode = Input::get('hexcolorcode');
$priorities->save();
$priority = Priority::select('id')->orderBy('created_at', 'desc')->first();
//for Task
$tasks = new Task;
$tasks->name = Input::get('task_name');
$tasks->priority_id = Input::get('priority');
$priorities->save();
// redirect
return Redirect::to('some view please change this');
请说明视图或显示屏幕截图,您将如何处理它。 现在,我已经为您提供了一种解决方案,其中包含一个控制器来处理优先级和任务。
解
我将task_id属性添加到任务模型内部的可填充数组中。
protected $fillable = ['name', 'description', 'priority_id'];
我有一个理解问题,因为user_id是从框架自动分配的,但未在可填充数组中指定。 那是因为我说$ request-> user-> tasks-> create(); 它是从框架分配的,但是priority_id是通过用户分配的,因此它是批量分配的,需要在可填充数组中指定。
@Murlidhar Fichadia
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.