在 Laravel 中使用外键创建新模型时如何自动插入身份验证用户 id?

问题描述 投票:0回答:1

我的 Laravel 项目中有一个“项目”表。迁移看起来像这样:

        Schema::create('projects', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('key')->nullable();
            $table->integer('bpm')->nullable();
            $table->boolean('is_collaborative')->default(false);
            $table->foreignId('owner_id')->constrained('users')->cascadeOnDelete();
            $table->timestamps();
        });

我希望

owner_id
字段引用用户的 ID,以便了解项目的所有者是谁(因为项目将是协作的并且多个用户将可以访问它们)。

在我的项目模型上创建以下方法后:

public function owner(): BelongsTo
    {
        return $this->belongsTo(User::class, 'owner_id');
    }

以及我的用户模型上的以下方法:

public function projectsOwned(): HasMany
    {
        return $this->hasMany(Project::class, 'owner_id');
    }

我在我的 ProjectController 上实现了

store
功能:

public function store(Request $request)
    {
        // Validate the data input by the user.
        $validatedData = $request->validate([
            'title' => ['required', 'max:255'],
        ]);

        // Create a new project.
        auth()->user()->projects()->create($validatedData);

        return to_route('projects.index')->with('status', __('Project created successfully!'));
    }

问题是,这个函数会抛出以下异常:

General error: 1364 Field 'owner_id' doesn't have a default value
执行时。

如何让 Laravel 自动将经过身份验证的用户 id 插入到

owner_id
字段中,而无需将
owner_id
添加到项目模型的
$fillable
数组中?

PS:我还在用户和项目之间建立了多对多关系,以跟踪谁有权访问哪些项目。这就是为什么我在尝试在数据库中存储新项目时使用

auth()->user()->projects()
方法。

php laravel eloquent foreign-keys
1个回答
0
投票

Laravel 有一些约定,您需要遵循这些约定才能使其正常工作。即使您使用的是owner_id,我也没有看到所有者表,它正在用户表上查找user_id。您还调用了商店功能:

auth()->user()->projects()->create($validatedData);

这也是在寻找auth用户的id,auth仅与经过身份验证的用户关联,而不是任何其他模型。

如果您确实需要owner_id字段,您可以创建一个所有者表并在该表上引用您的用户,然后才能在所有者的项目表上引用它。然后在你的商店功能上,你可以通过 id 找到所有者,然后存储,但由于这没有从用户模型进行身份验证,你必须确保owner_id位于模型上的可填写属性中,或者你可以使用 protected 代替(我从不建议你在学习时保持警惕)。

请记住,迁移需要按顺序进行,因此请将主要迁移列在关系表之前。用户,然后是所有者,然后是项目。

© www.soinside.com 2019 - 2024. All rights reserved.