使用Laravel 5.8.31,对于表中不应为空的内容,我似乎遇到了违反完整性约束的情况。问题在于,它告诉我迁移文件中的posts.title不应为null,但该变量甚至不在迁移表中。
SQLSTATE [23000]:违反完整性约束:19 NOT NULL约束>失败:posts.title(SQL:插入“ posts”(“标题”,“ image”,“ user_id”,>“ updated_at”,“ created_at” ”)(值(kjhgj,C:\ xampp \ tmp \ phpE3B7.tmp,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解释了为什么这些命令在本文的注释中起作用。
答案 0 :(得分:0)
要允许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尝试将数组的所有数据插入数据库表。
答案 1 :(得分:0)
这是一个远景,但是我会做些不同的事情,并手动测试所有内容以查看它是否有效。例如,您可以尝试以下方法:
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!';
}
}
让我知道这是否可行。