web-dev-qa-db-fra.com

Comment exclure certaines colonnes lors de l'utilisation d'éloquent

Lorsque j'utilise éloquent, je peux utiliser la méthode "where" puis la méthode "get" pour remplir un objet contenant ce que j'ai sélectionné dans ma base de données. Je veux dire:

$users = User::where('gender', 'M')->where('is_active', 1)->get(['pseudo', 'email', 'age', 'created_at'])->toArray();

Ici, je peux choisir les colonnes que je veux obtenir comme 'pseudo', 'email', etc. Mais ce qui me manque dans laravel doc est la façon de faire le contraire. Cela pourrait être quelque chose comme ça:

$users = User::where('gender', 'M')->where('is_active', 1)->notGet(['pseudo', 'email', 'age', 'created_at'])->toArray();

Merci pour votre future réponse et bonne journée.

36
Brazeredge

AFAIK il n'y a pas d'option de construction dans SQL pour exclure explicitement les colonnes, donc Laravel ne peut pas le faire. Mais vous pouvez essayer cette astuce

Mise à jour

Une autre astuce consiste à spécifier toutes les colonnes de votre modèle

protected $columns = array('id','pseudo','email'); // add all columns from you table

public function scopeExclude($query,$value = array()) 
{
    return $query->select( array_diff( $this->columns,(array) $value) );
}

Ensuite, vous pouvez faire:

$users = User::where('gender', 'M')->where('is_active', 1)->exclude(['pseudo', 'email', 'age', 'created_at'])->toArray();
44
Razor

Je ne sais pas sur la précédente Laravel version, mais en 5.4, vous pouvez mettre cette ligne dans le modèle utilisateur

protected $hidden = ['pseudo', 'email', 'age', 'created_at'];

puis User::find(1); renverra tous les champs sauf pseudo, email, age et created_at.

Mais vous pouvez toujours récupérer ces champs masqués en utilisant:

$user = User::find(1);
$email = $user['email']; // or $user->email;
35

utiliser hidden array dans le modèle est bien, mais si vous ne voulez pas cacher votre colonne tout le temps et utiliser makeVisible pour y accéder dans le besoin, alors à la place , masquez votre colonne de la sérialisation là où vous en avez besoin avec la fonction makeHidden comme ceci:

$res = Model::where('your query')->get();
$res->makeHidden(['column_one','column_two');
return response()->json($res);
21
sajed zarrinpour

vous pouvez utiliser le tableau hidden comme ceci:

class Promotion extends Model
{
    protected $table = 'promotion';
    protected $hidden = array('id');
}
9
vuhung3990

Nous obtenons l'objet éloquent du modèle plein de tous les champs, le transformons en tableau et nous le mettons à l'intérieur d'une collection. Ensuite, nous obtenons tous les champs sauf tous les champs spécifiés dans les champs $ array.

$fields = ['a', 'b', 'c', 'N'];
$object = Model::find($id);
return collect($object->toArray())->except($fields);

Plus clairement, donnons un exemple:

// Array of fields you want to remove
$fields_to_remove = ['age', 'birthday', 'address'];

// Get the result of database
$user = User::find($id);

// Transform user object to array
$user = $user->toArray();

// Create a collection with the user inside
$collection = collect($user);

// Get all fields of our collection except these fields we don't want
$result = $collection->except($fields_to_remove);

// Return
return $result;

Cet exemple ci-dessus fait exactement la même chose que le premier, mais il est plus expliqué.

5
Rafael Xavier

J'ai examiné la réponse de @Razor

Mais il existe un moyen très pratique en ignorant la propriété $ colonnes

/**
     * Scope a query to only exclude specific Columns
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeExclude($query, ...$columns) 
    {
        return $query->select( array_diff( $this->getTableColumns(),$columns) );
    }

    /**
     * Shows All the columns of the Corresponding Table of Model
     *
     * @author Manojkiran.A <[email protected]>
     * If You need to get all the Columns of the Model Table.
     * Useful while including the columns in search
     * @return array
     **/
    public function getTableColumns()
    {
        return $this->getConnection()->getSchemaBuilder()->getColumnListing($this->getTable());
    }

getTableColumns la fonction obtiendra toutes les colonnes de la table afin que vous n'ayez pas besoin de définir le

propriété $ column

0
Manojkiran.A