Modificateur


Introduction
Définir un accesseur

Définir un modificateur
    "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 le auquel 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'attribut first_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éthode setFooAttribute sur le modèle. Les champs Foo accessibles sont nommés en utilisant "camelCase". Définissons un autre modificateur pour l'attribut first_name. Ce modificateur sera automatiquement appelé lorsque nous essaierons de définir la valeur de l'attribut first_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'attribut first_name sur Sally : 🎜
    <?php   
     namespace App;    
     use Illuminate\Database\Eloquent\Model;    
     class User extends Model  
       {       
        /**
         * 这个属性应该被转换为原生类型.
         *
         * @var array
         */       
          protected $casts = [        
              'is_admin' => 'boolean',        
              ];    
            }
🎜Dans cet exemple, la méthode setFirstNameAttribute est appelée En acceptant la valeur Sally comme paramètre. Le modificateur applique ensuite la fonction strtolower et définit le résultat du traitement sur le tableau interne $attributes. 🎜🎜🎜🎜🎜🎜🎜

Date Converter

Par défaut, Eloquent convertira les champs created_at et updated_at en Carbon created_atupdated_at 字段转换为 Carbon 实例,它继承了 PHP 原生的 DateTime 类并提供了各种有用的方法。你可以通过设置模型的 $dates 属性来添加其他日期属性:

    $user = App\User::find(1); 
    if ($user->is_admin) {      
      //  
      }

{tip} 你可以通过将模型的公有属性 $timestamps 值设置为 false 来禁用默认的 created_atupdated_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, realfloatdoubledecimal:<digits>string, booleanobject, arraycollectiondatedatetime, 和 timestamp。 当需要转换为 decimal 类型时,你需要定义小数位的个数,如: decimal:2

示例, 让我们把以整数(01 )形式存储在数据库中的 is_admin 属性转成布尔值。

rrreee

现在当你访问 is_admin instance, qui hérite de la classe native DateTime 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 :

rrreee

{tip} Vous pouvez définir l'attribut public du modèle $timestamps sur la valeur Set false pour désactiver les horodatages par défaut created_at et updated_at.

Lorsqu'un champ est au format date, vous pouvez définir la valeur sur un horodatage UNIX, une chaîne datetime (Y-m-d) ou DateTime / Instance Carbone. Les valeurs de date seront formatées correctement et enregistrées dans votre base de données :

rrreee
Comme mentionné ci-dessus, lorsque les attributs obtenus sont contenus dans l'attribut $dates, ils seront automatiquement convertis en Instance Carbon
, permettant d'utiliser n'importe quelle méthode Carbon sur l'attribut : 🎜rrreee
🎜< 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 >, date, datetime et timestamp. Lorsque vous devez convertir en type decimal, vous devez définir le nombre de décimales, tel que : decimal:2🎜🎜Exemple, convertissons un entier ( 0 ou 1), l'attribut is_admin stocké dans la base de données est converti en valeur booléenne. 🎜rrreee🎜Maintenant, lorsque vous accédez à l'attribut is_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 array 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 champ JSON ou TEXT qui est sérialisé en JSON et que vous ajoutez une conversion de type array à votre Eloquent model , il sera automatiquement converti en tableau PHP lorsque vous y accéderez. array 类型的转换非常有用。比如:如果你的数据库具有被序列化为 JSON 的 JSONTEXT 字段类型,并且在 Eloquent 模型中加入了 array 类型转换,那么当你访问的时候就会自动被转换为 PHP 数组。

rrreee

一旦定义了转换,你访问  options 属性时他会自动从 JSON 类型反序列化为 PHP 数组。当你设置了 options 属性的值时,给定的数组也会自动序列化为 JSON 类型存储:

rrreee

Date 转换

当使用 datedatetimerrreee

Une fois la conversion définie, elle se désérialisera automatiquement du type JSON vers un tableau PHP lorsque vous accéderez à l'attribut options. Lorsque vous définissez la valeur de l'attribut options, le tableau donné sera également automatiquement sérialisé dans un stockage de type JSON :
rrreee
🎜Conversion de date🎜🎜Lorsque vous utilisez l'attribut date ou datetime, 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🎜. 🎜🎜