在null上调用成员函数create()

时间:2016-02-22 10:56:21

标签: php laravel laravel-5.2

我知道这和其他人一样,但是我无法找到合适的答案。这是我的问题。

我试图在插入用户数据后将数据插入到另一个表中。但我得到的是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。 什么是我的代码错误?因为我对我的其他工作使用相同的,并且它很好。请有人解释我并给我一个解决方案。请..

谢谢,

3 个答案:

答案 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');