Modificateur
Introduction
- "Convertisseur de date"
- Les accessoires et modificateurs vous permettent de formater les valeurs des propriétés Eloquent lorsque vous obtenez ou définissez certaines valeurs de propriété dans une instance de modèle Eloquent. Par exemple, vous souhaiterez peut-être utiliser un chiffreur Laravel pour chiffrer une valeur stockée dans une base de données, puis déchiffrer automatiquement la valeur lors de l'accès à la propriété à l'aide d'un modèle Eloquent. En plus des accesseurs et modificateurs personnalisés, Eloquent convertit également automatiquement les types de champs de date en instances Carbon
- ou en types de texte en JSON.
Accesseurs et modificateurs
Définir un accesseur
Pour définir un accesseur, vous devez créer une méthode
getFooAttribute
sur le modèle, et leauquel accéder Foo< Les champs /code> doivent être nommés en "camel case". Dans cet exemple, nous définirons un accesseur pour la propriété
first_name
. Lorsqu'Eloquent tente d'obtenir la propriétéfirst_name
, cet accesseur est automatiquement appelé :getFooAttribute
方法,要访问的Foo
字段需使用「驼峰式」命名。 在这个示例中,我们将为first_name
属性定义一个访问器。当 Eloquent 尝试获取first_name
属性时,将自动调用此访问器:<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 获取用户的姓名. * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } }
如你所见,字段的原始值被传递到访问器中,允许你对它进行处理并返回结果。如果想获取被修改后的值,你可以在模型实例上访问
first_name
属性:$user = App\User::find(1); $firstName = $user->first_name;
当然,你也可以通过已有的属性值,使用访问器返回新的计算值:
/** * 获取用户的姓名. * * @return string */ public function getFullNameAttribute(){ return "{$this->first_name} {$this->last_name}"; }
{tip} 如果你需要将这些计算值添加到模型的数组 / JSON 中, 你需要追加它们.
定义一个修改器
若要定义一个修改器,则需在模型上面定义
setFooAttribute
方法。要访问的Foo
字段使用「驼峰式」命名。让我们再来定义一个first_name
属性的修改器。当我们尝试在模式上在设置first_name
属性值时,该修改器将被自动调用:<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 设置用户的姓名. * * @param string $value * @return void */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); } }
修改器会获取属性已经被设置的值,允许你修改并且将其值设置到 Eloquent 模型内部的
$attributes
属性上。举个例子,如果我们尝试将first_name
属性的值设置为Sally
:$user = App\User::find(1); $user->first_name = 'Sally';
在这个例子中,
setFirstNameAttribute
方法在调用的时候接受Sally
这个值作为参数。接着修改器会应用strtolower
函数并将处理的结果设置到内部的$attributes
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 应该转换为日期格式的属性. * * @var array */ protected $dates = [ 'seen_at', ]; }
Comme vous pouvez le voir, la valeur brute du champ est transmise à l'accesseur, vous permettant de la traiter et de renvoyer le résultat . Si vous souhaitez obtenir la valeur modifiée, vous pouvez accéder à l'attributfirst_name
sur l'instance du modèle :$user = App\User::find(1); $user->deleted_at = now(); $user->save();
Bien sûr, vous pouvez également utiliser l'accesseur pour renvoyer la nouvelle valeur calculée via la valeur d'attribut existante :$user = App\User::find(1); return $user->deleted_at->getTimestamp();
{tip} Si vous devez ajouter ces valeurs calculées au tableau/JSON du modèle, vous devez les ajouter.🎜🎜
🎜🎜Définir un modificateur🎜🎜Pour définir un modificateur, vous devez définir la méthodesetFooAttribute
sur le modèle. Les champsFoo
accessibles sont nommés en utilisant "camelCase". Définissons un autre modificateur pour l'attributfirst_name
. Ce modificateur sera automatiquement appelé lorsque nous essaierons de définir la valeur de l'attributfirst_name
sur le schéma : 🎜<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ /** * 模型日期字段的保存格式. * * @var string */ protected $dateFormat = 'U'; }
🎜Le modificateur obtiendra la valeur de l'attribut qui a été défini, vous permettant de modifier et définissez sa valeur sur l'attribut$attributes
à l'intérieur du modèle Eloquent. Par exemple, si nous essayons de définir la valeur de l'attributfirst_name
surSally
: 🎜<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 这个属性应该被转换为原生类型. * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ]; }
🎜Dans cet exemple, la méthodesetFirstNameAttribute
est appelée En acceptant la valeurSally
comme paramètre. Le modificateur applique ensuite la fonctionstrtolower
et définit le résultat du traitement sur le tableau interne$attributes
. 🎜🎜🎜🎜🎜🎜🎜Date Converter
Par défaut, Eloquent convertira les champs
created_at
etupdated_at
en Carboncreated_at
和updated_at
字段转换为 Carbon 实例,它继承了 PHP 原生的DateTime
类并提供了各种有用的方法。你可以通过设置模型的$dates
属性来添加其他日期属性:$user = App\User::find(1); if ($user->is_admin) { // }
{tip} 你可以通过将模型的公有属性
$timestamps
值设置为false
来禁用默认的created_at
和updated_at
时间戳。当某个字段是日期格式时,你可以将值设置为一个 UNIX 时间戳,日期时间 (
Y-m-d
) 字符串,或者DateTime
/Carbon
实例。日期值会被正确格式化并保存到你的数据库中:<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 这个属性应该被转换为原生类型. * * @var array */ protected $casts = [ 'options' => 'array', ]; }
就如上面所说,当获取到的属性包含在
$dates
属性中时,都会自动转换为 Carbon 实例,允许你在属性上使用任意的 Carbon 方法:$user = App\User::find(1); $options = $user->options; $options['key'] = 'value'; $user->options = $options; $user->save();
日期格式
默认情况下,时间戳都将以
'Y-m-d H:i:s'
形式格式化。如果你需要自定义时间戳格式,可在模型中设置$dateFormat
属性。这个属性决定了日期属性将以何种形式保存在数据库中,以及当模型序列化成数组或 JSON 时的格式:/** * 这个属性应该被转化为原生类型. * * @var array */ protected $casts = [ 'created_at' => 'datetime:Y-m-d', ];
属性类型转换
模型中的
$casts
属性提供了一个便利的方法来将属性转换为常见的数据类型。$casts
属性应是一个数组,且数组的键是那些需要被转换的属性名称,值则是你希望转换的数据类型。支持转换的数据类型有:integer
,real
,float
,double
,decimal:<digits>
,string
,boolean
,object
,array
,collection
,date
,datetime
, 和timestamp
。 当需要转换为decimal
类型时,你需要定义小数位的个数,如:decimal:2
示例, 让我们把以整数(
rrreee0
或1
)形式存储在数据库中的is_admin
属性转成布尔值。现在当你访问
rrreeeis_admin
instance, qui hérite de la classe nativeDateTime
de PHP et fournit diverses méthodes utiles. Vous pouvez ajouter d'autres attributs de date en définissant l'attribut$dates
du modèle :
Lorsqu'un champ est au format date, vous pouvez définir la valeur sur un horodatage UNIX, une chaîne datetime ({tip} Vous pouvez définir l'attribut public du modèle
$timestamps
sur la valeur Setfalse
pour désactiver les horodatages par défautcreated_at
etupdated_at
.Y-m-d
) ouDateTime
/Instance Carbone
. Les valeurs de date seront formatées correctement et enregistrées dans votre base de données : rrreeeComme mentionné ci-dessus, lorsque les attributs obtenus sont contenus dans l'attribut, permettant d'utiliser n'importe quelle méthode Carbon sur l'attribut : 🎜rrreee$dates
, ils seront automatiquement convertis en Instance Carbon🎜< h4> Format de date🎜Par défaut, les horodatages seront formatés sous la forme'Y-m-d H:i:s'
. Si vous devez personnaliser le format de l'horodatage, vous pouvez définir l'attribut$dateFormat
dans le modèle. Cet attribut détermine comment l'attribut date sera enregistré dans la base de données et formaté lorsque le modèle est sérialisé dans un tableau ou JSON : 🎜rrreee🎜🎜🎜🎜🎜Conversion de type d'attribut🎜🎜L'attribut$casts
dans un modèle fournit un moyen pratique de convertir des attributs en types de données courants. La propriété$casts
doit être un tableau où les clés sont les noms des propriétés qui doivent être converties et les valeurs sont les types de données que vous souhaitez convertir. Les types de données prenant en charge la conversion sont :integer
,real
,float
,double
,decimal:< ; chiffres>
,chaîne
,booléen
,objet
,tableau
,collection code> >,
date
,datetime
ettimestamp
. Lorsque vous devez convertir en typedecimal
, vous devez définir le nombre de décimales, tel que :decimal:2
🎜🎜Exemple, convertissons un entier (0
ou1
), l'attributis_admin
stocké dans la base de données est converti en valeur booléenne. 🎜rrreee🎜Maintenant, lorsque vous accédez à l'attributis_admin
, bien que la valeur stockée dans la base de données soit de type entier, la valeur de retour sera toujours convertie en type booléen : 🎜rrreee🎜🎜🎜🎜🎜 🎜Conversion Array & JSON
La conversion de type
rrreeearray
est très utile lorsque vous stockez des données JSON sérialisées dans la base de données. Par exemple : si votre base de données a un type de champJSON
ouTEXT
qui est sérialisé en JSON et que vous ajoutez une conversion de typearray
à votre Eloquent model , il sera automatiquement converti en tableau PHP lorsque vous y accéderez.array
类型的转换非常有用。比如:如果你的数据库具有被序列化为 JSON 的JSON
或TEXT
字段类型,并且在 Eloquent 模型中加入了array
类型转换,那么当你访问的时候就会自动被转换为 PHP 数组。一旦定义了转换,你访问
rrreeeoptions
属性时他会自动从 JSON 类型反序列化为 PHP 数组。当你设置了options
属性的值时,给定的数组也会自动序列化为 JSON 类型存储:Date 转换
当使用
Une fois la conversion définie, elle se désérialisera automatiquement du type JSON vers un tableau PHP lorsque vous accéderez à l'attributdate
或datetime
rrreeeoptions
. Lorsque vous définissez la valeur de l'attributoptions
, le tableau donné sera également automatiquement sérialisé dans un stockage de type JSON : 🎜Conversion de date🎜🎜Lorsque vous utilisez l'attributdate
oudatetime
, vous pouvez spécifier le format de la date. Ce format sera utilisé pour sérialiser le modèle dans un tableau ou JSON :🎜rrreee🎜Cet article a été publié pour la première fois sur le site 🎜LearnKu.com🎜. 🎜🎜