Laravel - Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа - PullRequest
1 голос
/ 29 апреля 2020

В настоящее время я изучаю Laravel через личный проект.

Контекст

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

Ошибка

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не удается (parabolica-dev. articles, CONSTRAINT articles_user_id_foreign ИНОСТРАННЫЙ КЛЮЧ (user_id) ССЫЛКИ users (id)) (SQL: вставить в articles (title, content, excerpt, updated_at, created_at) значения (rgergregerg, regergergregerg, regregregregreg, 2020-04-29 09:55:12, 2020-04-29 09:55:12))

Модели

Артикул

class Article extends Model
{
    protected $fillable = ['title', 'content', 'excerpt', 'user_id'];

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

Пользователь

class User extends Authenticatable
{
    protected $fillable = [
        'name', 'email', 'password',
    ];

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

Миграции

Пользователи

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Статьи

class CreateArticlesTable extends Migration
{
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->string('title');
            $table->text('excerpt');
            $table->text('content');
            $table->string('type');
            $table->string('status');

            // Relationship between article and user

            $table->bigInteger('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Контроллер

ArticleController

class ArticleController extends Controller
{
    public function store(StoreArticle $request)
    {
        $validatedData = $request->validated();

        $user = Auth::user()->id;
        $article = Article::create($validatedData);
        $article->user_id = $user;
        $request->session()->flash('status', 'Article was created!');

        return redirect()->route('articles.show', ['article' => $article->id]);
    }
}

Решения опробованы

  • При добавлении user_id в массив $ fillable в моей модели Article я все еще получаю ошибка.
  • Добавление метода nullable () к user_id в моей миграции. Сохранение статьи проходит без сообщения об ошибке, но впоследствии в моей таблице user_id записывается как ноль.

Это 2 наиболее предложенных решения для SO / LaravelCasts из того, что я нашел. Любые предложения о том, что я сделал не так?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вы должны изменить эти три строки. Вы вставляете строку, но в то время как user_id является нулевым. Вот почему он показывает ошибку, потому что вы присвоили полю user_id значение NULL.

$article = new Article;
$article->fill($validatedData); 
$article->user_id = Auth::user()->id;
$article->save();
1 голос
/ 29 апреля 2020

Метод create создает и сохраняет новый экземпляр вашей модели. Поскольку модель не включает идентификатор пользователя в этот момент, она завершается ошибкой.

Это можно исправить, добавив user_id в массив fillables вашей модели, а также добавив идентификатор пользователя в массив $validatedData перед созданием модели.

Кроме того, вы также можете создать новый экземпляр вашей модели с ключевым словом new, установить все данные и явным образом сохранить их, как только вы закончите:

$article = new Article($validatedData);
$article->user()->associate( Auth::user() );
$article->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...