web-dev-qa-db-fra.com

Appel à la méthode non définie Illuminate \ Database \ Query \ Builder :: Associate ()

Référence: Comment puis-je mettre à jour une relation Eloquent existante dans Laravel 4?

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

Je reçois l'erreur: Call to undefined method Illuminate\Database\Query\Builder::associate()

Voici la méthode complète:

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

associé () est une méthode de la relation appartient à, mais il semble que d'après ce qui précède, vous essayez de l'appeler via la relation hasOne.

Je suppose que vous n'avez pas fourni votre code de classe de modèle éloquent, vous ne pouvez donc pas voir comment vous avez défini les relations exactement, mais si vous avez:

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

class Userinfo extends Eloquent {

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

L'associé doit ensuite être appelé par rapport à Userinfo car il a la relation membersTo à laquelle la méthode Associate () est attachée.

Par exemple

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

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

Définira la clé étrangère user_id dans la table user_info sur l'id de l'objet $ user.

En regardant votre code ci-dessus, il ne semble pas que ce soit ce que vous essayez de faire et que le

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

l'appel que vous avez commenté fera en fait ce que vous semblez essayer d'atteindre, qui est de mettre à jour les informations utilisateur liées à l'utilisateur actuel si cet utilisateur existe déjà.

J'espère que cela t'aides.

Glen

32
glendaviesnz

Remplacez hasOne par belongsTo. Cela ressemblera à:

class User extends Eloquent {

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

class Userinfo extends Eloquent {

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