J'aimerais pouvoir ajouter un attribut / propriété personnalisé à un modèle Laravel / Eloquent lorsqu'il est chargé, de la même manière que cela pourrait être réalisé avec la $model->open()
méthode de RedBean .
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 rempli.
J'ai essayé d'utiliser certains des événements de modèle décrits dans la documentation pour attacher cette propriété lors du chargement de l'objet, mais sans succès jusqu'à présent.
Remarques:
- «disponible» n'est pas un champ de la table sous-jacente.
$sessions
est renvoyé en tant qu'objet JSON dans le cadre d'une API, et donc appeler quelque chose comme$session->available()
dans un modèle n'est pas une option
protected $hidden = []
pour ajouter des colonnes / accesseurs à avoir exclu.La dernière chose sur la page doc Laravel Eloquent est:
Cela peut être utilisé automatiquement pour ajouter de nouveaux accesseurs au modèle sans aucun travail supplémentaire comme la modification des méthodes comme
::toArray()
.Créez simplement l'
getFooBarAttribute(...)
accesseur et ajoutez lefoo_bar
à la$appends
matrice.la source
toArray
méthode.Si vous renommez votre
getAvailability()
méthode,getAvailableAttribute()
votre méthode devient un accesseur et vous pourrez la lire->available
directement sur votre modèle.Documents: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
EDIT: votre attribut étant "virtuel", il n'est pas inclus par défaut dans la représentation JSON de votre objet.
Mais j'ai trouvé ceci: les accesseurs de modèles personnalisés ne sont pas traités lorsque -> toJson () est appelé?
Pour forcer le retour de votre attribut dans le tableau, ajoutez-le comme clé au tableau $ attributes.
Je ne l'ai pas testé, mais cela devrait être assez trivial pour vous d'essayer dans votre configuration actuelle.
la source
->available
disponible sur l'$session
objet, mais comme il$sessions
est converti directement en chaîne JSON (il fait partie d'une API), il n'y a aucune chance de l'utiliser.EventSession::all()
renvoie un objet JSON à partir d'une API, vous n'utilisez pas vraiment un modèle Laravel, non? Désolé, je suis confus sur la façon dont vous avez implémenté votre modèle.class EventSession extends Eloquent
).::all()
n'est qu'un exemple.EventSession::find(170071)
en serait un autre. Celles-ci sont appelées à différents points de SessionController (SessionController extends \BaseController
) qui seraient appelés via des URL telles que «/ sessions / 170071».public $available
le modèle, il n'apparaît pas lors de la conversion de l'objet.protected $appends = array('is_admin');
)J'avais quelque chose de similaire: j'ai une image d'attribut dans mon modèle, elle contient l'emplacement du fichier dans le dossier Storage. L'image doit être retournée encodée en base64
la source
vous pouvez utiliser la
setAttribute
fonction dans le modèle pour ajouter un attribut personnaliséla source
Supposons que vous ayez 2 colonnes nommées first_name et last_name dans votre table d'utilisateurs et que vous souhaitiez récupérer le nom complet. vous pouvez réaliser avec le code suivant:
vous pouvez maintenant obtenir le nom complet sous la forme:
la source
Étape 1: définir les attributs à l'
$appends
étape 2: définir l'accesseur pour ces attributs.
Exemple:
la source
Dans mon modèle d'abonnement, je dois savoir que l'abonnement est suspendu ou non. voici comment je l'ai fait
puis dans le modèle de vue, je peux utiliser
$subscription->is_paused
pour obtenir le résultat.Le
getIsPausedAttribute
est le format pour définir un attribut personnalisé,et utilise
is_paused
pour obtenir ou utiliser l'attribut dans votre vue.la source
dans mon cas, la création d'une colonne vide et la définition de son accesseur ont bien fonctionné. mon accesseur remplissant l'âge de l'utilisateur à partir de la colonne dob. La fonction toArray () a également fonctionné.
la source