提问者:小点点

Laravel-如何在会话创建时用auth用户填充用户id字段?


我有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 

共1个答案

匿名用户

我会在你创建它的时候设置它,这是最易读和最直接的。

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;
        }
    });