Laravel Jetstream - 如何在注册时加入默认团队

Laravel Jetstream - How to join a default team at registration

我正在尝试更改 Laravel Jetstream 的逻辑,以便在注册时加入默认团队而不是创建个人团队。我找到了执行此操作的方法:

public function create(array $input)
{
    Validator::make($input, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => $this->passwordRules(),
        'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '',
    ])->validate();

    return DB::transaction(function () use ($input) {
        return tap(User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'password' => Hash::make($input['password']),
        ]), function (User $user) {
            $user->currentTeam = Team::find(1); # SQLSTATE[42S22]: Column not found: 1054 Unknown column 'currentTeam' in 'field list'
            $user->save();
        });
    });
}

这里的问题是 currentTeam 似乎是在数据库级别之后创建的,而不是数据库本身的列。 documentation 表示 currentTeam returns Team 模型但没有说明如何以编程方式更新当前用户团队。

我知道我可以手动使用数据库查询在 team_user table 中插入一行,但必须有一种方法可以做到这一点。

return DB::transaction(function () use ($input) {
        return tap(User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'password' => Hash::make($input['password']),
        ]), function (User $user) {
            DB::table('team_user')->insert(['user_id' => $user->id, 'team_id' => 1, 'role' => 'rfn']);
            $user->current_team_id = 1;
        });
    });

任何帮助将不胜感激,我知道这将依赖于这个始终存在于数据库中的团队,但将实施进一步的措施以使其无法删除。

在对本地 Laravel 版本进行一些修改之后,这是我想出的。这假设您想要将用户添加到的团队已经以某种方式创建,可能是通过播种机创建的,或者是手动创建的。您需要编辑的文件是app/Actions/Fortify/CreateNewUser.php,即createTeam方法。

我们不想创建新团队,而是想从数据库中获取一个团队,将其附加到新注册的用户,然后使现在附加的团队成为用户的当前团队。

protected function createTeam(User $user)
{
    $team = Team::first();

    $user->teams()->attach($team);

    $user->switchTeam($team);
}

我们首先需要先附加团队的原因是 switchTeam 检查用户是否属于该团队,如果不属于该团队,则 returns false 并且不会切换到新团队团队。通过首先附加团队,我们让用户属于该团队,然后我们才能真正切换到它作为当前团队。

您也可以在@KimHallberg 的上述回答中分配角色,如下所示

$team = Team::first();
$user->teams()->attach($team, array('role' => 'editor'));
$user->switchTeam($team);