我的 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()
方法。
Laravel 有一些约定,您需要遵循这些约定才能使其正常工作。即使您使用的是owner_id,我也没有看到所有者表,它正在用户表上查找user_id。您还调用了商店功能:
auth()->user()->projects()->create($validatedData);
这也是在寻找auth用户的id,auth仅与经过身份验证的用户关联,而不是任何其他模型。
如果您确实需要owner_id字段,您可以创建一个所有者表并在该表上引用您的用户,然后才能在所有者的项目表上引用它。然后在你的商店功能上,你可以通过 id 找到所有者,然后存储,但由于这没有从用户模型进行身份验证,你必须确保owner_id位于模型上的可填写属性中,或者你可以使用 protected 代替(我从不建议你在学习时保持警惕)。
请记住,迁移需要按顺序进行,因此请将主要迁移列在关系表之前。用户,然后是所有者,然后是项目。