我正在研究Laravel,在某个时候我不得不重新迁移数据库,因为我不得不更改表。我使用邮递员进行测试,其中一种api方法给我错误:
SQLSTATE [23000]:违反完整性约束:19 NOT NULL约束失败:events.user_id(SQL:插入“事件”(“ sport”,“ title”,“ players”,“ when”,“ description”, “位置”,“ updated_at”,“ created_at”)值(曲棍球,草地曲棍球,12、30 / 09/2018,快来加入我们,锦绣花园,2018-11-08 22:19:45,2018-11-08 22:19:45))
所以events.user_id似乎有问题,我在名为Events的表上更改为与Users表有关系。我通过研究发现的一些示例是关于非id的表字段的,所以我不知道如何解决这一问题,也许有些人可以帮助我!
这是事件和用户的迁移:
public function up()
{
Schema::create('events', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
$table->string('sport');
$table->string('title');
$table->decimal('players', 8, 2);
$table->date('when');
$table->mediumText('description');
$table->string('location');
$table->timestamps();
});
}
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
以下是模型:
class Event extends Model
{
protected $fillable = [
'sport',
'title',
'players',
'when',
'description',
'location'
];
public function user()
{
return $this->belongsTo('App\User');
}
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function events()
{
return $this->hasMany('App\Event');
}
}
下面是给我错误的api方法:
Route::post('/admin/create-event', function (Request $request) {
$data = $request->all();
$event = Event::create(
[
'sport' => $data['sport'],
'title' => $data['title'],
'players' => $data['players'],
'when' => $data['when'],
'description' => $data['description'],
'location' => $data['location'],
]
);
return $event;
});
谢谢大家!
编辑:
Route::middleware('auth:api')->post('/admin/create-event', function (Request $request) {
$user = $request->user();
$data = $request->all();
$event = Event::create(
[
'user_id' => \Auth::user()->id,
'sport' => $data['sport'],
'title' => $data['title'],
'players' => $data['players'],
'when' => $data['when'],
'description' => $data['description'],
'location' => $data['location'],
]
);
return $event;
});
答案 0 :(得分:0)
您需要传递user_id:
'user_id' => \Auth::user()->id
上面的示例在会话中需要经过身份验证的用户,但是如果您使用邮递员发出请求,则可能没有一个。
无论如何,您需要提供将存储在数据库中的user_id。
Eloquent的方法create
仅将定义为fillable
的属性复制到模型。因此,您有两种选择:
user_id
添加到$fillable
newInstance
代替create
,用user_id
手动设置$event->user_id = ...
,并用$event
手动保存$event->save();
模型答案 1 :(得分:0)
我认为您必须将'user_id'添加到Event类的$ fillable中:
class Event extends Model
{
protected $fillable = [
'sport',
'title',
'players',
'when',
'description',
'location',
'user_id'
];
public function user()
{
return $this->belongsTo('App\User');
}
}