Laravel a un casting intégré pour les types date
et datetime
, mais si vous souhaitez utiliser les durées ISO 8061 avec la classe DateInterval
native ou CarbonInterval
de Carbon, vous n'avez pas de chance.
Ce package fournit deux conversions personnalisées (pour DateInterval
et CarbonInterval
respectivement) à l'aide de la fonctionnalité de conversion personnalisée de Laravel 7.x/8.x.
composer require atymic/laravel-dateinterval-cast
Dans $casts
de votre modèle, attribuez la propriété sur laquelle vous souhaitez activer le casting à l'un des castings fournis par le package. Vous devez utiliser un champ varchar
/ string
dans votre table de base de données.
class TestModel extends Model
{
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $ casts = [
' is_xyz ' => ' boolean ' ,
' date_interval ' => DateIntervalCast::class,
' carbon_interval ' => CarbonIntervalCast::class,
];
}
La propriété du modèle sera ensuite convertie en un objet d'intervalle et enregistrée dans la base de données en tant que chaîne de durée ISO 8061. Si vous essayez d'attribuer une durée non valide (ou si la table de la base de données en contient une et que vous utilisez un getter), une exception est levée.
$ model = new TestModel ();
$ model -> carbon_interval = now ()-> subHours ( 3 )-> diffAsCarbonInterval ();
$ model -> save (); // Saved as `P3H`
$ model -> fresh ();
$ model -> carbon_interval ; // Instance of `CarbonInterval`
$ model -> carbon_interval -> forHumans (); // prints '3 hours ago'
try {
$ model -> carbon_interval = ' not_a_iso_period ' ;
} catch ( Atymic DateIntervalCast Exception InvalidIsoDuration $ e ) {
// Exception thrown if you try to assign an invalid duration
}
Contributions bienvenues :) Veuillez créer un PR et je le réviserai/le fusionnerai.
MIT