2015-11-05 22 views
8

Sono nuovo di laravel. Sto lavorando su un'app di laravel 5 e sono bloccato qui. Ho 2 modelli in quanto tali:Come aggiornare una tabella pivot usando Eloquent in laravel 5

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

Esistono molti-a-molti tra messaggio e l'utente dandomi una tabella pivot come tale:

Table Name: message_user 
Colums: 
message_id 
user_id 
status 

Ho una query SQL in quanto tale:

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

Come posso tradurre questa query sull'equivalente di laravel?

+0

Amico, cosa intendi per "da"? –

+0

Chiave esterna @Mohamed –

+0

amico il secondo argomento è il nome della tabella di congiunzione, nel tuo esempio dovrebbe essere 'message_user', la relazione di destra totale per ** messaggi ** in ** Utente ** modello: 'return $ this- > hasMany ('App \ Message \,' message_user ',' user_id ',' message_id '); ' –

risposta

7

Il codice qui sotto risolto il mio problema:

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

Per l'aggiornamento della tabella pivot è possibile utilizzare il metodo updateExistingPivot.

+0

Grazie a @Babar. Puoi aggiungere qualsiasi codice di esempio su come posso usare il metodo per venire con la query sul post. –

+0

È possibile consultare la documentazione all'indirizzo http://laravel.com/docs/5.0/eloquent#working-with-pivot-tables utente :: find (1) -> ruoli() - > updateExistingPivot ($ roleId, $ attributes); –

3

È possibile utilizzare su di queste due funzioni, sync()attach() e la deferenza in poche parole è che Sync otterrà array come primo argomento e sincronizzarlo con tabella pivot (togliere e aggiungere le chiavi passati nella propria matrice) il che significa che se hai 3,2,1 come valutato nella tua tabella di giunzione, e hai passato la sincronizzazione con valori di, 3,4,2, la sincronizzazione automaticamente rimuoverà il valore 1 e aggiungerà il valore 4 per te. dove Fissare avrà valore ID unico

Il GIST: se si desidera aggiungere i valori in più per la vostra tabella di collegamento, passarlo come secondo argomento al Sync() in questo modo:

$message = Messages::where('id','123'); 
$user = User::where('id','4'); 

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



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

Grazie per il tuo contributo @Mohamed. La sincronizzazione non ha funzionato per me. –

+0

@FokwaBest tizio basato sul tuo commento sopra, vuoi solo molti a molti rapporti, quindi c'è un ingannevole con le tue relazioni eloquenti, se vuoi posso aggiornare la mia risposta e scrivere le giuste relazioni e dopo che 'sync()' sarà lavoro :) –

+0

amico in realtà quando un utente crea un messaggio, viene memorizzato nella tabella dei messaggi. La tabella pivot conserva solo un record di message_id e del destinatario ($ user_id). Funziona abbastanza bene ora, ma mi piacerebbe comunque vedere il tuo approccio. –

Problemi correlati