我知道这和其他人一样,但是我无法找到合适的答案。这是我的问题。
我试图在插入用户数据后将数据插入到另一个表中。但我得到的是Call to a member function create() on null
。
这是我的AuthController.php代码
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
$user->usersbasics()->create([
'user_id' => $user->id,
]);
return $user;
}
这是我的用户模型
public function usersbasics()
{
$this->hasOne('App\UsersBasics');
}
这是我的UsersBasics模型:
public function user()
{
$this->belongsTo('App\User');
}
我尝试var_dumb($user->usersbasics())
,结果为NULL。
什么是我的代码错误?因为我对我的其他工作使用相同的,并且它很好。请有人解释我并给我一个解决方案。请..
谢谢,
答案 0 :(得分:2)
这是一个迟到的答案,但我遇到了同样的问题。
您的关系中没有return关键字。
public function user()
{
return $this->belongsTo('App\User');
}
和
public function usersbasics()
{
return $this->hasOne('App\UsersBasics');
}
这为我修好了。
答案 1 :(得分:1)
您需要在用户模型中设置参数fillable
。
class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
}
答案 2 :(得分:0)
您的控制器方法受保护而非公开。
如果你看一下现有的AuthController,我们有你提到的功能:
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
然后使用postRegister调用此方法(public,因此可以从routes.php调用),其中我们仅传递来自Request的输入作为参数。
public function postRegister(Request $request)
{
$validator = $this->validator($request->all());
if ($validator->fails()) {
$this->throwValidationException(
$request, $validator
);
}
$user = $this->create($request->all());
return redirect($this->redirectPath());
}
我假设你试图直接从控制器调用create()方法,这不起作用,因为它受到保护,只能从类本身内部调用。如果你真的想让create()方法在没有postRegister的情况下工作,你可以这样做:
public function create(Request $request)
{
$user = User::create([
'name' => $request->input('name'),
'email' => $request->input('email'),
'password' => bcrypt($request->input('password')),
]);
$user->usersbasics()->create([
'user_id' => $user->id,
]);
return $user;
}
然后在你的routes.php中调用它
Route::post('urlToPostMethod', 'Auth\AuthController@create');
另一种通常更好的方法是将其称为
Route::post('urlToPostMethod', 'Auth\AuthController@postRegister');