> Faqs > Evitar que al serializar un modelo de Laravel se envíen también los modelos relacionados

Evitar que al serializar un modelo de Laravel se envíen también los modelos relacionados

Cuando tengo un modelo en Laravel y ese modelo tiene relaciones con otros modelos, al serializar el primer modelo a veces se envían las relaciones con los modelos asociados. Esto ocurre en el caso que se haya accedido a la relación por algún motivo.

Por ejemplo tengo el modelo Project, y ese modelo tiene relación con el modelo de usuario y se ha accedido a la relación, en un código como este:

$project = Project::where('id', $id)->with(['customer'])->get();

Al enviar el modelo $project como respuesta en un controlador, se está incluyendo el objeto customer asociado.

¿Cómo puedo evitar ese envío del modelo asociado?

Respuestas

Todos los modelos cuando se serializan envían las relaciones a las que se ha accedido.

Recordemos que Laravel tiene carga perezosa de las relaciones. Pero aunque al hacer la consulta con Eloquent no hayas usado with() para traterte alguna relación, simplemente con acceder a ella te la va a meter en el modelo serializado.

Simplemente con hacer una comprobación de este estilo, te va a meter el modelo de customer en la serialización de $project.

if($project->customer->user_id == $user->id)

La solución consiste en deshacer esa carga perezosa elminando del modelo el objeto de la relación que no quieras que se serialice. Esto lo conseguimos con el método unsetRelation() al que le enviamos el nombre de la relación que queremos evitar que se envíe.

Por ejemplo:

$project->unsetRelation('customer');

Luego, si tu controlador devuelve $project, simplemente no vendrá el objeto de relación con el customer.

Miguel Angel
3295 146 215 17