В настоящее время я изучаю 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 из того, что я нашел. Любые предложения о том, что я сделал не так?
Спасибо за помощь!