php - Laravel Eloquent 关系 - 违反完整性约束

标签 php mysql eloquent laravel-5

我有 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);
    }
}

任务 Controller

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]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (tasks.tasks, CONSTRAINT tasks_priority_id_foreign FOREIGN KEY (priority_id) REFERENCES priorities (id)) (SQL: insert into tasks (name, user_id, updated_at, created_at) values (test task, 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');
        });
    }
}

更新

优先级 Controller

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');
    }
}

最佳答案

在您的商店方法中。它说的创建方法:

用户->任务()。该位只会在用户和任务表中插入数据。这就是为什么你有外键错误。由于您没有更新其中一个表(优先级),并且您已经在表中添加了外键,正如我从迁移中看到的那样。

如果您有一个名为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');

请解释一下 View 或显示屏幕截图,您是如何处理的。目前,我已经为您提供了一个解决方案,其中一个 Controller 处理优先级和任务。

关于php - Laravel Eloquent 关系 - 违反完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36967863/

相关文章:

php - 尝试了解 PHP 密码盐/加密

PHP 函数无法识别不同的语言

php - 如何在数组元素的最后一个实例之后输出小计

php - Eloquent::一对一,在两个表中均有效,但具有特定角色

php - enctype ="multipart/form-data"和 enctype ="multipart/form-data;charset=utf-8"有什么区别

mysql - 我可以在一个 MySQL 数据库中使用 2 个 WordPress 数据库吗

mysql - dropwizard 和 hibernate 中的主从

java - MySQL/JDBC 问题

laravel - 在 Laravel 中使用增量 updateOrCreate

php - Laravel 非重复计数