У меня есть таблица пользователей и проектов. в таблице проекта user_id - внешний ключ. я создаю проект, и когда я пытаюсь сохранить детали проекта, он показывает эту ОШИБКУ:

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (labtest. projects, CONSTRAINT projects_user_id_foreign FOREIGN KEY (user_id ) ССЫЛКИ users (id) ОБ ОБНОВЛЕНИИ КАСКАДА) (SQL: вставить в Projects (name, description, date, {{X10 }}, created_at) значения (например, 2017-12-31, 2017-09-19 15:21:06, 2017-09-19 15:21:06))

Как я могу решить это?

Миграция таблицы пользователей:

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

Миграция таблицы проектов

   Schema::create('projects', function (Blueprint $table) {
        $table->increments('id')->unique();
        $table->string('name');
        $table->text('description');
        $table->date('date');
        $table->timestamps('date');
    });



   Schema::table('projects',function(Blueprint $table)
    {
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users')
    ->onUpdate('cascade');
    });

Модель пользователя:

 public function project()
 {
     return $this->hasMany('App\Project');
  }

Модель проекта:

  public function user() {
      return $this->belongsTo('App\User','id','user_id');
   }

Контроллер:

  public function store(Request $request)
{

    $this->validate($request, [
        'name' => 'required',
        'description' => 'required',
        'date' => 'required',
    ]);


    Project::create($request->all());
    return redirect()->route('projects.index')
                    ->with('success','Project created successfully');
}
2
kavi 19 Сен 2017 в 18:29

3 ответа

Лучший ответ

У вас есть две альтернативы:

  • Первый:

    $data = $request->all();
    $data['user_id'] = Auth::user()->id;
    Project::create($data);
    //....
    
  • Второй:

    Auth::user()->project()->create($request->all());
    
0
Maraboc 19 Сен 2017 в 15:44

Вы можете получить пользователя, а затем использовать его для создания проекта следующим образом:

$user = auth()->user();
$user->project()->create([
     $request->all()
]);

Преимущество этого в том, что вам не нужно указывать 'user_id' непосредственно как $ fillable. Конечно, вы захотите добавить эти (другие) поля для заполнения в модели (так как вы используете метод create())

Одна вещь, которую мы наблюдали, это множественность вашей связанной модели, я думаю, вы можете избежать путаницы, используя projects, а не project, поскольку он один пользователь для многих проектов.

0
Oluwatobi Samuel Omisakin 19 Сен 2017 в 15:40

Как вы определили таблицу проектов, user_id не обнуляется. Поэтому, если вы хотите вставить проект, вы должны передать действительный user_id вызову create().

0
Philippe 19 Сен 2017 в 15:33