mysql - wherepivot - Cómo actualizar una tabla dinámica usando Eloquent en laravel 5
updateexistingpivot laravel (3)
Soy nuevo en laravel. Estoy trabajando en una aplicación laravel 5 y estoy atrapado aquí. Tengo 2 modelos como tal:
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'');
}
}
Existe una relación de muchos a muchos entre Mensaje y Usuario que me da una tabla dinámica como tal:
Table Name: message_user
Colums:
message_id
user_id
status
Tengo una consulta SQL como tal:
update message_user
set status = 1
where user_id = 4 and message_id in (select id from messages where message_id = 123)
¿Cómo puedo traducir esta consulta al equivalente de Laravel?
El siguiente código resolvió mi problema:
$messages = Message::where(''message_id'', $id)->get();
foreach($messages as $message)
$message->users()->updateExistingPivot($user, array(''status'' => 1), false);
Para actualizar su tabla dinámica, puede usar el método updateExistingPivot.
Puede usar una de estas dos funciones, sync()
attach()
y la deferencia en pocas palabras es que Sync obtendrá array como su primer argumento y lo sincronizará con la tabla dinámica (eliminar y agregar las claves pasadas en su matriz) lo que significa si obtuviste 3,2,1 como valor en tu tabla de unión, y pasaste la sincronización con los valores de 3,4,2, la sincronización automáticamente eliminará el valor 1 y agregarás el valor 4 por ti. donde Attach tendrá un valor de ID único
El GIST: si desea agregar valores extra a su tabla de unión, páselo como segundo argumento a Sync()
manera:
$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 ] ]);