【问题标题】:Call to undefined method Illuminate\Database\Query\Builder::associate()调用未定义的方法 Illuminate\Database\Query\Builder::associate()
【发布时间】:2013-11-21 00:58:02
【问题描述】:

参考: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);
}

【问题讨论】:

    标签: php laravel-4 eloquent


    【解决方案1】:

    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 调用 associate,因为它具有关联 associate() 方法的 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);
    

    您已注释掉的调用实际上会执行您似乎想要实现的目标,即更新与当前用户相关的用户信息(如果该用户已存在)。

    希望这会有所帮助。

    格伦

    【讨论】:

    • 谢谢。使用 update() 工作正常,所以我会使用它。从引用的线程中,我得到的印象是 associate() 是正确的方法。错误消失了: $userinfo->user()->associate($user); $userinfo->保存($userinfoArray);但它没有保存 $userinfoArray...
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我被这个问题困扰了几天,最终解决起来很简单。我在“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,
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        你需要像这样指定相关的字段:

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

        【讨论】:

        • 如果您的数据库具有正确的命名约定,您实际上不必指定 id。
        猜你喜欢
        • 2017-02-20
        • 2014-04-23
        • 2020-01-04
        • 2018-10-03
        • 1970-01-01
        • 2019-04-02
        • 2016-11-25
        • 2017-07-19
        • 2017-01-18
        相关资源
        最近更新 更多