2015-08-15 141 views
1

我做的扩展建立在对用户模型幼虫5. 我想做到的是,一旦用户注册并通过验证我想ANOTHER数据库表中创建一个名为USERINFO这与用户模型具有属于关系,并且用户模型与userInfo具有hasOne关系。Laravel创建用户信息数据库表时,用户注册

两件事。 如何成功实现这一逻辑。我读 http://laravel.com/docs/master/eloquent-relationships#inserting-related-modelshttp://laravel.com/docs/5.1/events#registering-events-and-listeners

但是我不肯定

其次。 我最好在哪里实现这个逻辑。

在此先感谢

PS。我不会结合这两个数据库,因为用户模型是在注册时生存在userInfo中的数据是“可选的”,以便用户填充后进行身份验证。

回答

2

如果我正确理解问题,您想在注册时为用户创建其他相关模型。这应该是非常简单的 - 例如:

$user->userInfo()->save(UserInfo::create([ 
    //whatever information you need to save to the userInfo table - if any 
])); 

至于放在哪里,您可以选择那里。你可以把它放在注册控制器上的'商店'方法。或者将其提取到服务类'RegisterUser',并在那里创建用户和userInfo。

类似:

//controller method 
public function store(Request $request, RegisterUser $registerUser) 
{ 
    $user = $registerUser->handle($request); 

    return view(....) 
} 

//RegisterUser class 
public function __construct(UserInfo $userInfo) 
{ 
    $this->userInfo = $userInfo; 
} 

public function handle($request) 
{ 
    // create your user 
    $user = ..... 

    $user->userInfo()->save($this->userInfo->create([ 
     ..... 
    ])); 

    // whatever else you need to do - send email, etc 

    return $user; 
} 

编辑:如果您使用Laravel 5和默认注册脚手架,那么你可以将代码添加到应用程序\ SERVICES \注册器类。这个类被trait中的postRegister方法调用。更改创建方法:

// app\Services\Registar 
public function create(array $data) 
{ 
    $user = User::create([ 
     'name' => $data['name'], 
     'email' => $data['email'], 
     'password' => bcrypt($data['password']), 
    ]); 

    $user->userInfo()->save($this->userInfo->create([ 
     ..... 
    ])); 

    // whatever else you need to do - send email, etc 

    return $user; 
} 

如果使用Laravel 5.1,则注册器类不存在了,创建方法已被移动到AuthController(方法是一样的,只是在一个不同的位置),所以在那里覆盖它。

+0

我还没有触及应用程序的初始脚手架,所以store方法是'AuthenticatesAndRegistersUsers'特性中的'postRegister'函数。上面提到的例子是合乎逻辑的,但我似乎无法将它放到'postRegister'函数中。 –

+0

假设您使用Laravel 5(而不是5.1),则实际上可以将代码添加到app \ services \ Registar类中。它有一个由trait中的postRegister函数调用的创建方法。我将更详细地编辑我的答案。 –

0

你的答案指出我在正确的方向,但我对你编辑的问题做了一些简单的tweek。

$user->userInfo()->firstOrCreate([ 
'aboutMe' => 'Please Fill out so users can know about you', 
'bodyType' => '--', 
]); 
return $user;