Cómo ocultar propiedades de un modelo Eloquent con setVisible y setHiddlen en Laravel

Spread the love

Laravel proporciona mucha flexibilidad cuando trabajas con los modelos, por lo cual tiene distintas formas de hacer lo mismo, de esta manera puedes usar los modelos en diferentes escenarios.

Por ejemplo, puedes usar el atributo $hidden para especificar que propiedades deben ocultarse.

namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['api_token']; //👈oculta la columna
}

Entonces, cuando intentes convertir el modelo en un arreglo o formato JSON, la propiedad api_token estará oculta.

$user = User::find(1);

return $user->toArray();
/*
[
    "id" => 1,
    "name" => "Rodolfo Sanders",
    "email" => "example@example.com",
]
*/

Pero, ¿qué sucede si deseas ocultar algunas propiedades, pero no quieres especificarlas en el atributo $hidden

Por supuesto, puedes usar los métodos makeHidden makeVisible, pero no funcionan como esperas,

Así que Laravel nos proporciona dos métodos nuevos, para especificar que campos queremos que sean realmente visibles y cuáles ocultar del resultado cuando convertimos un modelo a un arreglo o JSON

Método setVisible

El método setVisible te permite especificar qué propiedades mostrar en el formato JSON del modelo.

$user = User::find(1);

return $user->setVisible(['name', 'email'])->toArray();

/*
[
    "name" => "Rodolfo Sanders",
    "email" => "example@example.com",
]
*/

A diferencia del método makeVisible existente, el método setVisible solo muestra las propiedades que se le indican, en nuestro ejemplo cuando el modelo solo convertirá a arreglo las propiedades name y email.

Método setHidden

De manera similar, el método setHidden le permite especificar qué propiedades deben ocultarse cuando un modelo se convierte a un arreglo o formato JSON.

$user = User::find(1);

return $user->setHidden(['api_token','email'])->toArray();
/*
[
    "id" => 1,
    "name" => "Rodolfo Sanders",
]
*/

A diferencia del método makeHidden existente, el método setHidden solo oculta las propiedades que se le indican, en nuestro ejemplo cuando el modelo se convierte a arreglo no se incluirán las propiedades api_token y email

Conclusión

Los métodos setVisible setHidden son útiles cuando deseas ocultar o mostrar explícitamente ciertas propiedades de un modelo, pero no desea especificarlas en la propiedad oculta $hidden.

Si tienes alguna duda, déjame tu comentario.