簡體   English   中英

Laravel雄辯的關系-違反完整性約束

[英]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無法添加或更新子行:外鍵約束失敗( taskstasks ,CONSTRAINT tasks_priority_id_foreign FOREIGN KEY( priority_id )參考prioritiesid ))(SQL:插入tasksnameuser_idupdated_atcreated_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM