我有一个简单的文章模型和一个用户模型。
文章“belongsTo”用户和用户“hasMany”文章。
因此,我的文章迁移有一个名为“user_id”的外键。
Schema::create('articles', function(Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
然而,每当我创建一个文章,我通过“用户_id”在一个隐藏的领域,我得到一个错误消息。
{!! Form::open(array('route' => 'articles.store')) !!}
{!! Form::hidden('userId', $user->id) !!}
<div class="form-group">
{!! Form::label('title', 'Title') !!}
{!! Form::text('title', null, array('class' => 'form-control')) !!}
</div>
<div class="form-group">
{!! Form::label('text', 'Write your Article') !!}
{!! Form::textarea('text', null, array('class' => 'form-control')) !!}
</div>
{!! Form::submit('Create Article', array('class' => 'btn btn-default btn-success')) !!}
{!! Form::close() !!}
这是错误消息。我明白我没有尝试将'user_id'的值插入到articles表中。
SQLSTATE[23000]:违反完整性约束:1452无法添加或更新子行:外键约束失败(tags
. articles
,CONSTRAINT articles_user_id_foreign
FOREIGN KEY(user_id
)REFERENCES users
(id
))(SQL:insert into articles
(title
,body
,updated_at
,created_at
)values(Title,Some text,2015 -03-21 23:19:33,2015-03-21 23:19:33))
下面是我在AriclesController上的Store方法:
Article::create([
'title' => Input::get('title'),
'body' => Input::get('text'),
'user_id' => Input::get('userId')
]);
return Redirect::to('articles');
还有几十个其他开放的Stackoverflow问题具有类似的标题,我正在寻找适合我的特定情况的答案,但没有成功,因此我提前感谢你善良的陌生人。
如何将文章保存到数据库中?
6条答案
按热度按时间wz8daaqr1#
确保您的Article模型的
fillable
属性中有user_id
。http://laravel.com/docs/5.0/eloquent#mass-assignment
6ioyuze22#
我也遇到了同样的问题。我向一个已经存在并且有数据的表添加了一个外键,但是我无法运行迁移,因为它一直失败。使迁移工作正常的解决方案是使外键可为空。
希望将来能节省别人的时间。
xqnpmsa83#
我在为现有表运行迁移时遇到过几次这个错误。原因如下:
1.'user_id'和users 'id'的类型是不同的。例如,当'user_id'是INT而users 'id'是BIGINT时。
1.列“user_id”不为空,您需要将其设置为可空
1.列“user_id”中的值在用户“id”中不存在
tktrz96b4#
对我来说,工作是通过添加
nullable()
也与Laravel 7+,你可以做foreignId
,所以为您的情况$table->foreignId('user_id')->nullable()->constrained()->cascadeOnDelete();
对于回滚
$table->dropForeign(['user_id']);
和$table->dropColumn('user_id');
此外,如果数据存在,我们不希望在生产环境中将其拉下,因此您可以禁用外键约束
qaxu7uf25#
我遇到了这个问题,因为我正在使用现有数据更新现有表,因此添加外键会导致问题,因为没有默认的外键分配给条目。我通过首先从表中删除数据,然后重新运行迁移来解决这个问题
tmb3ates6#
在我的情况下(laravel 7)需要在创建列时添加nullable,并且在创建外部时添加-〉nullable()-〉constrained()-〉cascadeOnDelete(),此外它还包括DB事务,因为在错误发生之前正在创建新表,并且我总是需要在运行迁移之前删除它