调用未定义的方法Illuminate \ Database \ Query \ Builder :: associate()

时间:2013-11-08 21:29:48

标签: php laravel-4 eloquent

参考:How can I update an existing Eloquent relationship in Laravel 4?

$userinfo = \Userinfo::find($id);
\User::find($id)->userinfo()->associate($userinfo)->save();

我收到错误:Call to undefined method Illuminate\Database\Query\Builder::associate()

以下是整个方法:

public function saveUser($id)
{
    $user = \User::find($id);

    $userdata = \Input::all();

    $rules = array(
        'email' => 'required|email',
        'state' => 'size:2',
        'zip'   => 'size:5',
        'phone' => array('regex:/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/')
    );

    $validator = \Validator::make($userdata, $rules);

    if ($validator->passes())
    {
        if ($userdata['email'] !== $user->email)
        {
            $rules = array('email' => 'unique:users');
            $validator = \Validator::make($userdata, $rules);
            if ($validator->fails()) return Redirect::route('admin.user.edit', array('user' => $user))
                ->with('error', 'Specified email already exists.');
        }

        $user->email                = $userdata['email'];
        $user->firstname            = $userdata['firstname'];
        $user->lastname             = $userdata['lastname'];

        $userinfoArray = array(
            'address'   => $userdata['address'],
            'city'      => $userdata['city'],
            'state'     => $userdata['state'],
            'zip'       => $userdata['zip'],
            'phone'     => preg_replace('/[^0-9]/', '', $userdata['phone'])
        );

        $user->save();

        if (!$user->userinfo)
        {
            $userinfo = new \Userinfo($userinfoArray);
            $userinfo = $user->userinfo()->save($userinfo);
        }
        else
        {
            $userinfo = \Userinfo::find($id);
            \User::find($id)->userinfo()->associate($userinfo)->save();
            //$user->userinfo()->update($userinfoArray);
        }

        return \Redirect::route('admin.user.detail', array('id' => $id))
            ->with('success', 'User updated.');
    }

    return \Redirect::route('admin.user.edit', array('id' => $id))
        ->withInput()
        ->withErrors($validator);
}

4 个答案:

答案 0 :(得分:32)

associate()是belongsTo关系的一种方法,但从上面看,你试图通过hasOne关系调用它。

我只是在猜测,因为你没有提供你雄辩的模型类代码所以不能看到你如何准确地设置关系,但如果你有:

class User extends Eloquent {
    public function userinfo()
    {
        return $this->hasOne('Userinfo');
    }
}

class Userinfo extends Eloquent {

    public function user() {
        return $this->belongsTo('User');
    }
}

然后需要对Userinfo调用关联,因为它具有与attachment()方法相连的belongsTo关系。

例如

$user = \User::find(4);      
$userinfo = \UserInfo::find(1);

$userinfo->user()->associate($user);
$userinfo->save();

将user_info表中的外键user_id设置为$ user对象的id。

看看上面的代码,看起来这并不是你实际上要做的事情而且

$user->userinfo()->update($userinfoArray);
你注释掉的

调用实际上会做你似乎想要实现的目标,即更新与当前用户相关的userinfo(如果该用户已经存在)。

希望这会有所帮助。

格伦

答案 1 :(得分:3)

hasOne更改为belongsTo。它看起来像:

class User extends Eloquent {

    public function userinfo()
    {
        return $this->belongsTo('Userinfo');
    }
}

class Userinfo extends Eloquent {

    public function user() {
        return $this->belongsTo('User');
    }
}

答案 2 :(得分:-2)

您需要指定与此相关的字段:

    public function profile()
    {
        return $this->hasOne('App\AdmProfile', 'id');
    }

答案 3 :(得分:-2)

我被困在这个问题上几天了,结果很难解决。我在'app'文件夹中创建了一个名为'models'的文件夹,但我忘了重新配置我的auth.php文件。

这是我的错误。

Call to undefined method Illuminate\Database\Query\Builder

我通过打开config文件夹中的auth.php并更改以下行来包含我的模型文件夹来修复它。

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => Foodie\User::class,

修正:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => Foodie\Models\User::class,

希望这有帮助!

相关问题