web-dev-qa-db-fra.com

Laravel: éloquent comment mettre à jour un modèle et les modèles associés en une seule fois

Est-ce que quelqu'un sait s'il est possible de faire ce qui suit:

Disons que nous avons un modèle appelé User et un modèle appelé d BestFriend. La relation entre l'utilisateur et le meilleur ami est de 1: 1.

J'aimerais que ces cas puissent faire quelque chose comme ça, changer ma ville et la ville de mon ami en même temps.

$me = User::find(1);

$me->update(array(
'city' => 'amsterdam',
'bestfriend.city' => 'amsterdam'
));

Donc, fondamentalement, je voudrais savoir si Eloquent est assez intelligent pour comprendre la relation basée sur la clé de tableau "bestfriend.city".

Merci d'avance pour votre aide!

Mise à jour:

J'ai trouvé la solution sur les forums Laravel mais je la poste ici aussi si quelqu'un d'autre cherche la même chose :)

Dans le modèle que vous ajoutez

// In your model...
public function setBestFriendArrayAttribute($values)
{
    $this->bestfriend->update($values);
}

Et puis vous pouvez l'appeler comme ça

$me->update(array(
    'city' => 'amsterdam',
    'BestFriendArray' => array(
        'city' => 'amsterdam'
    )
));

Fonctionne comme un charme!

26
MvdP

Vous n'avez pas besoin de le définir sur votre modèle. Vous pouvez le faire sur votre contrôleur comme ceci.

$me = User::find(1)->bestFriend()->update(array(
'city' => 'amsterdam',
'bestfriend.city' => 'amsterdam'
));

Je viens de modifier un peu votre mise à jour.

8
dakine

Eloquent est assez intelligent, mais je ne pense pas qu'il puisse faire cela. Vous devez mettre à jour User et BestFriend indépendamment. Mais une fois que vous avez fait cela, Eloquent a des méthodes pour attacher les deux.

$me = User::find(1);
$bff= BestFriend::find(1);

$me->city = 'amsterdam'; 
$bff->city = 'amsterdam';

$me->bestfriend()->associate($bff);

Cela suppose bien sûr que votre modèle utilisateur possède une fonction qui ressemble à ...

public function bestfriend()
{
    return $this->hasOne('BestFriend');
}
4
user1669496