[英]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.