279 votes

Ajouter un attribut personnalisé à un modèle Laravel / Eloquent lors du chargement ?

J'aimerais pouvoir ajouter un attribut/propriété personnalisé à un modèle Laravel/Eloquent lorsqu'il est chargé, de manière similaire à ce que l'on peut réaliser avec RedBean's $model->open() méthode.

Par exemple, en ce moment, dans mon contrôleur j'ai :

public function index()
{
    $sessions = EventSession::all();
    foreach ($sessions as $i => $session) {
        $sessions[$i]->available = $session->getAvailability();
    }
    return $sessions;
}

Ce serait bien de pouvoir omettre la boucle et d'avoir l'attribut "disponible" déjà défini et alimenté.

J'ai essayé d'utiliser certains des événements de modèle décrits dans la documentation pour attacher cette propriété lorsque l'objet se charge, mais sans succès jusqu'à présent.

Notes :

  • Le terme "disponible" n'est pas un champ de la table sous-jacente.
  • $sessions est renvoyé sous la forme d'un objet JSON dans le cadre d'une API et, par conséquent, l'appel de quelque chose comme $session->available() dans un modèle n'est pas une option

20voto

jianfeng Points 491

Vous pouvez utiliser setAttribute dans Model pour ajouter un attribut personnalisé

11voto

ShuBham GuPta Points 150

Disons que vous avez 2 colonnes nommées first_name et last_name dans votre table users et que vous voulez récupérer le nom complet. Vous pouvez le faire avec le code suivant :

class User extends Eloquent {

    public function getFullNameAttribute()
    {
        return $this->first_name.' '.$this->last_name;
    }
}

maintenant vous pouvez obtenir le nom complet comme :

$user = User::find(1);
$user->full_name;

3voto

li bing zhao Points 874

Dans mon modèle d'abonnement, j'ai besoin de savoir si l'abonnement est en pause ou non. Voici comment j'ai procédé

public function getIsPausedAttribute() {
    $isPaused = false;
    if (!$this->is_active) {
        $isPaused = true;
    }
}

puis dans le modèle de vue, je peux utiliser $subscription->is_paused pour obtenir le résultat.

Le site getIsPausedAttribute est le format permettant de définir un attribut personnalisé,

et utilise is_paused pour obtenir ou utiliser l'attribut dans votre vue.

2voto

Hanif Rifa'i Points 21

Dans mon cas, la création d'une colonne vide et la définition de son accesseur ont bien fonctionné. Mon accesseur remplit l'âge de l'utilisateur à partir de la colonne dob. La fonction toArray() a également fonctionné.

public function getAgeAttribute()
{
  return Carbon::createFromFormat('Y-m-d', $this->attributes['dateofbirth'])->age;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X