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