完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败
Posted
技术标签:
【中文标题】完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败【英文标题】:Integrity constraint violation: 19 NOT NULL constraint failed for something not in migration table 【发布时间】:2019-12-20 18:26:31 【问题描述】:使用 Laravel 5.8.31,我似乎对表中不应为空的某些内容违反了完整性约束。问题是它告诉我迁移文件中的posts.title 不应该为空,但该变量甚至不在迁移表中。
SQLSTATE[23000]:完整性约束违规:19 NOT NULL 约束>失败:posts.title(SQL:插入“posts”(“caption”、“image”、“user_id”、>“updated_at”、“created_at ") 值 (kjhgj, C:\xampp\tmp\phpE3B7.tmp, 1, 2019->08-14 07:14:03, 2019-08-14 07:14:03))
我正在尝试学习 Laravel,并且一直在关注这个 youtube 教程 https://www.youtube.com/watch?v=ImtZ5yENzgE
从我从浏览器获得的错误页面中,我可以看到 PostsController.php 中引发了错误。
我赶到了 2:04:00,但遇到了这个问题。我已经阅读了许多其他在这里提出和回答的问题,但没有运气。
帖子迁移文件
class CreatePostsTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('posts', function (Blueprint $table)
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('caption');
$table->string('image');
$table->timestamps();
$table->index('user_id');
// THERE IS NO 'title' entry.
);
帖子模型文件
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
//Tutorial uses guarded rather than fillable
protected $guarded = [];
public function user()
return $this->belongsTo(User::class);
发布控制器文件
class PostsController extends Controller
public function create()
return view('posts.create');
public function store()
$data = request()->validate([
'caption' => 'required',
'image' => ['required','image'],
]);
auth()->user()->posts()->create($data); //ERROR IS THROWN HERE
dd(request()->all());
我有一个页面,用户可以在其中输入标题并上传文件。
没有任何验证,我可以dd(request()->all());
看到标题和文件已收到。但是当我在控制器文件中添加验证和auth()
行时,我得到“posts.title”的完整性约束违规
我希望将标题和图像添加到数据库中。
第一次发帖,因为我通常可以找到答案,但这次我卡住了。
编辑:这是错误: Error Image
解决了
@Vipertecpro 能够解决我的问题。我必须运行以下两个命令:
php artisan migrate:refresh --seed
然后php artisan optimize:clear
。
@Don'tPanic 解释了为什么这些命令在这篇文章的 cmets 中有效。
【问题讨论】:
试试这个Post::create(['column_name' => $request->get('value')])
,而不是auth()->user()->posts()->create($data);
,你为什么不在模型内的$fillable变量中包含所有列?
请分享您正在关注的视频链接以实现这个简单的 crud
@Vipertecpro 我在帖子中有链接以及视频中的时间。我不使用 fillable 的原因是因为他说只需将一个空字符串传递给 $guarded (似乎不是一个好主意,但我刚刚学习)。
参考这个以获得清晰的理解laravel.com/docs/5.8/eloquent#inserting-and-updating-models 并且请考虑观看任何编程视频以学习任何东西的最后一种方法,否则两种非常有效的方法是官方文档和点击和试用方法,相信我你会发现将数据插入数据库的方法超过 2 种。 :) 编码愉快。
"title" 列是否在您的 post 表中?
【参考方案1】:
这是一个长镜头,但我会做不同的事情并手动测试所有内容以查看它是否有效。例如,你可以试试这个:
class PostsController extends Controller
public function create()
return view('posts.create');
public function store(Request $request)
//Remove this for now
//$data = request()->validate([
// 'caption' => 'required',
// 'image' => ['required','image'],
//]);
$post = new Post;
$post->user_id = Auth::user()->id;
$post->caption = $request->caption;
//This assumes that you have 'caption' as your `name` in html. '<input type="text" name="caption" />'
$post->image = $request->image;
//The image should be processed but this will give an output for now.
$post->save();
//The save ignores $fillable or any such and depends on the request and SAVES it to the model or table
return 'worked!';
让我知道这是否有效。
【讨论】:
其他人能够解决这个问题。不过,我很感谢您的回复。【参考方案2】:要允许 Laravel 在数据库中进行大规模插入或更新,您必须在模型中声明 $fillable
变量。
在你的情况下:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
//Tutorial uses guarded rather than fillable
//protected $guarded = []; // If you use $fillable do not use $guarded
// HERE
protected $fillable = ['user_id', 'caption', 'image'];
public function user()
return $this->belongsTo(User::class);
如果不这样做,Laravel 会尝试将数组的所有数据插入 DB 表中。
【讨论】:
我明白这一点,但视频将一个空字符串传递给 guarded。即使我将您的行添加到我的代码中并注释掉 Post Model 中的受保护行,我仍然会收到 posts.title 的错误,这对我来说没有意义。 guarded 与可填充相反。你用它告诉 laravel 在进行大量插入或更新之前不要填写哪些字段。我编辑了我的答案 哦,我明白了。这就是为什么视频说要传递一个空数组给它的原因。它使他不必每次都制作一个可填充的。无论如何,谢谢你的回复。 @Vipertecpro 解决了我的问题。我必须运行两个命令。以上是关于完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败的主要内容,如果未能解决你的问题,请参考以下文章
JSLint 严格违规。面向对象的 Javascript 挫折
Spring - 在所有自定义身份验证提供程序结束时记录安全违规
不变违规:组件`div`的视图配置getter回调必须是一个函数(收到`undefined`)