web-dev-qa-db-fra.com

Comment mettre à jour un tableau croisé dynamique à l'aide d'Eloquent dans laravel 5

Je suis nouveau à Laravel. Je travaille sur une application laravel 5 et je suis coincé ici. J'ai 2 modèles en tant que tels:

class Message extends Eloquent{

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

    public function users()
    {
        return $this->belongsToMany('App\User')->withPivot('status');
    }
}

class User extends Eloquent {

    public function messages()
    {
        return $this->hasMany('App\Message', 'from');
    }

    public function receive_messages() {
        return $this->belongsToMany('App\Message')->withPivot('status');
    }
}

Il existe une relation plusieurs à plusieurs entre Message et User, qui me donne un tableau croisé dynamique en tant que tel:

Table Name: message_user
Colums:
message_id
user_id
status

J'ai une requête SQL en tant que telle:

update message_user
set status = 1
where user_id = 4 and message_id in (select id from messages where message_id = 123)

Comment puis-je traduire cette requête en équivalent laravel?

14
Fokwa Best

Le code ci-dessous a résolu mon problème:

$messages  = Message::where('message_id', $id)->get();
foreach($messages as $message)
   $message->users()->updateExistingPivot($user, array('status' => 1), false);
17
Fokwa Best

Vous pouvez utiliser l'une de ces deux fonctions, sync()attach() et la différence est que Sync obtiendra array comme premier argument et le synchronisera avec le tableau croisé dynamique (supprime et ajoute les clés passées dans votre tableau) ce qui signifie que si vous avez 3,2,1 comme valeur dans votre table de jonction et si vous passez la synchronisation avec les valeurs de 3,4,2, la synchronisation enlèvera automatiquement la valeur 1 et ajoutera la valeur 4 à votre place. où Attach prendra une valeur d'identifiant unique

The Gist: si vous souhaitez ajouter des valeurs supplémentaires à votre table de jonctions, transmettez-le comme second argument à sync() comme suit:

$message = Messages::find(123);
$user = User::find(4);

// using ->attach for single message
$user->message()->attach($message->id,['status' => 1 ]);



// using ->sync for multiple messages
$message2 = Messages::find(456); // for testing
$user->message()->sync([$message->id => ['status' => 1 ],$message2->id => ['status' => 1 ] ]);
7
Mohammad Kawsara

Pour mettre à jour votre tableau croisé dynamique, vous pouvez utiliser la méthode updateExistingPivot.

0
Babar Sajjad