调用未定义的方法Illuminate\Database\Query\Builder :: associate() [英] Call to undefined method Illuminate\Database\Query\Builder::associate()

查看:706
本文介绍了调用未定义的方法Illuminate\Database\Query\Builder :: associate()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

参考:如何更新现在在Laravel 4中的雄辩关系?

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

我收到错误:调用未定义的方法Illuminate\Database \Query\Builder :: associate()



以下是整个方法:


$ b $ public $ save $($ id)
{
$ user = \User :: find($ id); b

  

$ 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-> passed())
{
if($ userdata ['email']!== $ user-> email)
{
$ rules = array('email'=>'unique:users');
$ validator = \Validator :: make($ userdata,$ rules);
if($ validator-> failed())return Redirect :: route('admin.user.edit',array('user'=> $ user))
- > with 'error','指定的电子邮件已经存在。
}

$ 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 '成功','用户更新');
}

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


解决方案

的属性关系,但它看起来像从上面你正试图通过hasOne关系调用它。



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

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

class Userinfo extends Eloquent {

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

然后关联需要调用Userinfo,与...相关联的belongsTo关系。



例如

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

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

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

看看你上面的代码,看起来这不是你真正想做的,而且

  $用户>用户信息() - >更新($ userinfoArray); 

您已经注释掉的电话实际上会做你想要实现的,这是如果该用户已经存在,则更新与当前用户相关的userinfo。



希望这有帮助。



Glen


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

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

I'm getting the error: Call to undefined method Illuminate\Database\Query\Builder::associate()

Here is the entire method:

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);
}

解决方案

associate() is a method of the belongsTo relationship, but it looks like from the above you are trying to call it via the hasOne relationship.

I am just guessing as you have not provided your eloquent model class code so can't see how you have set the relationships exactly, but if you have:

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

class Userinfo extends Eloquent {

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

Then associate needs to be called against Userinfo as this has the belongsTo relationship to which the associate() method is attached.

For example

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

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

Will set the foreign key user_id in the user_info table to the id of the $user object.

Looking at your above code it doesn't appear that this is what you are actually trying to do and that the

$user->userinfo()->update($userinfoArray);

call which you have commented out will in fact do what you seem to be trying to achieve, which is to update the userinfo that is related to the current user if that user already exists.

Hope this helps.

Glen

这篇关于调用未定义的方法Illuminate\Database\Query\Builder :: associate()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆