tabla relacion pivote muchos crear consultar codigo laravel laravel-4

laravel - pivote - relacion muchos a muchos mysql workbench



EliminaciĆ³n suave en una tabla intermedia para una relaciĆ³n de muchos a muchos (3)

Por lo que yo entiendo; una tabla intermedia es simplemente una longitud de cadena que une un registro de tablas a un registro en otra tabla y, como tal, no requiere un método de eliminación suave.

Para explicarlo, imagine que tiene una tabla de Usuarios y una tabla de Grupos, cada usuario puede tener más de un Grupo y cada Grupo puede pertenecer a más de un Usuario. Su tabla dinámica puede ser User_Group o algo así y simplemente contiene dos columnas user_id y group_id .

Su tabla de User y la tabla de Group deben tener una columna deleted_at para eliminaciones de software, por lo que cuando "elimine" un grupo, esa asociación de grupo no aparecerá en $User->Groups() mientras que la fila de la tabla dinámica no se haya visto afectada. Si luego restauras ese grupo eliminado, aparecerá nuevamente en $User->Groups() .

La fila de la tabla dinámica solo debería verse afectada si ese registro de grupo se elimina por completo, en cuyo caso las filas de la dinámica también se deben eliminar.

Ahora he explicado por qué no creo que deba agregar una eliminación suave a una tabla dinámica; ¿Todavía hay una razón por la que necesita este comportamiento?

¿Cómo configuro la eliminación suave en una tabla intermedia que conecta dos tipos diferentes de entidades? He agregado la columna deleted_at, pero los documentos dicen que debo poner esto en el modelo:

protected $softDelete = true;

Por supuesto, no tengo un modelo para una tabla intermedia. ¿Alguna idea?


Puede poner una restricción en la carga Eager:

public function groups() { return $this ->belongsToMany(''Group'') ->whereNull(''group_user.deleted_at'') // Table `group_user` has column `deleted_at` ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at` }

En lugar de HARD eliminar la relación usando:

User::find(1)->groups()->detach();

Deberías usar algo como esto para eliminar SOFT en su lugar:

DB::table(''group_user'') ->where(''user_id'', $user_id) ->where(''group_id'', $group_id) ->update(array(''deleted_at'' => DB::raw(''NOW()'')));


También puede utilizar el método updateExistingPivot Elaraquent updateExistingPivot .

$model->relation->updateExistingPivot($relatedId, [''deleted_at'' => Carbon/Carbon::now()]);

Entonces, para usar los ejemplos de @RonaldHulshof, tiene un modelo de usuario con una relación de grupos que es una relación de pertenencia a muchos.

public function groups() { return $this->belongsToMany(Group::class)->whereNull(''groups_users.deleted_at'')->withTimestamps(); }

Luego, para borrar suavemente la entrada de la tabla dinámica, debería hacer lo siguiente.

$user->groups->updateExistingPivot($groupId, [''deleted_at'' => Carbon/Carbon::now()]);