我有3张桌子,有:
User: id | name
Support: id | title | user_id
Conversation: id | support_id | user_id | body
这些模型(表)之间的关系是:
/*** User ***/
public function supports(){
return $this->hasMany(Support::class);
}
/*** Support ***/
public function user(){
return $this->belongsTo(User::class);
}
public function conversations(){
return $this->hasMany(Conversation::class);
}
/*** Conversation ***/
public function user()
{
return $this->belongsTo(User::class);
}
public function support()
{
return $this->belongsTo(Support::class);
}
/*** SupportController ***/
public function store(Store $request)
{
DB::transaction(
function () use ($request) {
user()->supports()->create(
$request->only(
[
'title',
]
)
)->conversations()->create(
$request->only(
[
'body',
]
)
);
}
);
}
每当创建资源的新实例时,我想用经过身份验证的用户的id填充Conversation model上的user_id字段。
当前,在support表user_id字段中,用auth用户的ID填充。 但在对话中,我会出现以下错误。
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value
我会在你创建它的时候设置它,这是最易读和最直接的。
user()->supports()->create(
$request->only(
[
'title',
]
) +
[
'user_id' => $request->user()->id,
]
)
如果您想要智能解决方案,可以在subscription.php
模型上使用boot方法,在创建事件时设置user_id。 我不喜欢这个解决方案,但这是一种方法,如果你想要的话。
protected static function boot()
{
parent::boot();
static::creating(function (Subscription $model) {
$request = resolve(Request::class);
if (! $model->user_id && $request->user()) {
$model->user_id = $request->user()->id;
}
});