Pengubah suai
pengenalan
- Penukaran Array & JSON
- Penukaran Tarikh
- Fasih: Pengubah suai
- Pengenalan Pengenalan
- Tentukan aksesori
- Tentukan pengubahsuai Penukar tarikh Aksesori dan pengubah suai membolehkan anda memformat nilai sifat Eloquent apabila anda dapatkan atau tetapkan nilai harta tertentu dalam contoh model Eloquent. Contohnya, anda mungkin mahu menggunakan penyulitan Laravel untuk menyulitkan nilai yang disimpan dalam pangkalan data, dan kemudian menyahsulit nilai secara automatik apabila mengakses harta menggunakan model Eloquent.
- Selain pengakses tersuai dan pengubah suai, Eloquent juga menukar jenis medan tarikh secara automatik kepada Carbon tika atau jenis teks kepada JSON
Aksesor & Pengubah suai
Tentukan pengakses
Untuk mentakrifkan pengakses, anda perlu mencipta kaedah
getFooAttribute
pada model danuntuk diakses /code> medan perlu dinamakan dalam "kas unta". Dalam contoh ini, kami akan menentukan pengakses untuk sifat
first_name
. Apabila Eloquent cuba mendapatkan hartafirst_name
, pengakses ini dipanggil secara automatik: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', ]; }
Seperti yang anda lihat, nilai mentah medan dihantar ke pengakses, membolehkan anda memprosesnya dan mengembalikan hasil . Jika anda ingin mendapatkan nilai yang diubah suai, anda boleh mengakses atributfirst_name
pada contoh model:$user = App\User::find(1); $user->deleted_at = now(); $user->save();
Sudah tentu, anda juga boleh menggunakan pengakses untuk mengembalikan nilai baru yang dikira melalui nilai atribut sedia ada :$user = App\User::find(1); return $user->deleted_at->getTimestamp();
{tip} Jika anda perlu menambahkan nilai terkira ini pada tatasusunan model/JSON, anda perlu menambahkannya.🎜🎜
🎜🎜Tentukan pengubahsuai🎜🎜Untuk menentukan pengubahsuai, anda perlu mentakrifkan kaedahsetFooAttribute
pada model. MedanFoo
untuk diakses dinamakan menggunakan "camelCase". Mari kita tentukan satu lagi pengubah suai untuk atributfirst_name
. Pengubah suai ini akan dipanggil secara automatik apabila kami cuba menetapkan nilai atributfirst_name
pada skema: 🎜<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ /** * 模型日期字段的保存格式. * * @var string */ protected $dateFormat = 'U'; }
🎜Pengubah suai akan mendapat nilai atribut yang telah ditetapkan, membolehkan anda mengubah suai dan tetapkan nilainya kepada atribut$attributes
dalam model Eloquent. Sebagai contoh, jika kita cuba menetapkan nilai atributfirst_name
kepadaSally
: 🎜<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 这个属性应该被转换为原生类型. * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ]; }
🎜Dalam contoh ini, kaedahsetFirstNameAttribute
dipanggil Apabila menerima nilaiSally
sebagai parameter. Pengubah suai kemudian menggunakan fungsistrtolower
dan menetapkan hasil pemprosesan kepada tatasusunan$attributes
dalaman. 🎜🎜🎜🎜🎜🎜🎜Penukar Tarikh
Secara lalai, Eloquent akan menukar medan
created_at
danupdated_at
kepada 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
contoh, yang mewarisi kelasDateTime
asli PHP dan menyediakan pelbagai kaedah berguna. Anda boleh menambah atribut tarikh lain dengan menetapkan atribut$dates
model:
Apabila medan dalam format tarikh, anda boleh menetapkan nilai kepada cap waktu UNIX, rentetan datetime ({tip} Anda boleh menetapkan atribut awam model
$timestamps
kepada nilai Setfalse
untuk melumpuhkan cap waktucreated_at
danupdated_at
lalai.Y-m-d
) atauDateTime
/Contoh karbon
. Nilai tarikh akan diformat dengan betul dan disimpan ke pangkalan data anda: rrreeeSeperti yang dinyatakan di atas, apabila atribut yang diperoleh dimasukkan dalam atribut, membolehkan anda menggunakan sebarang kaedah Karbon pada atribut: 🎜rrreee$dates
, ia akan ditukar secara automatik kepada Contoh Karbon🎜< h4> Format tarikh🎜Secara lalai, cap masa akan diformatkan dalam bentuk'Y-m-d H:i:s'
. Jika anda perlu menyesuaikan format cap masa, anda boleh menetapkan atribut$dateFormat
dalam model. Atribut ini menentukan cara atribut tarikh akan disimpan dalam pangkalan data dan diformatkan apabila model disirikan ke dalam tatasusunan atau JSON: 🎜rrreee🎜🎜🎜🎜🎜Penukaran jenis atribut🎜🎜Atribut$casts
dalam model menyediakan cara yang mudah untuk menukar atribut kepada jenis data biasa. Hartanah$casts
hendaklah berupa tatasusunan yang mana kuncinya ialah nama sifat yang perlu dihantar dan nilainya ialah jenis data yang ingin anda hantar. Jenis data yang menyokong penukaran ialah:integer
,real
,float
,double
,decimal:< ; digit>
,string
,boolean
,objek
,array
,collection kod> >,
tarikh ,masa tarikh dancap masa . Apabila anda perlu menukar kepada jenisdecimal
, anda perlu menentukan bilangan tempat perpuluhan, seperti:decimal:2
🎜🎜Contohnya, mari kita tukar integer (0
atau1
), atributis_admin
yang disimpan dalam pangkalan data ditukar kepada nilai Boolean. 🎜rrreee🎜Kini apabila anda mengakses atributis_admin
, walaupun nilai yang disimpan dalam pangkalan data ialah jenis integer, nilai pulangan akan sentiasa ditukar kepada jenis Boolean: 🎜rrreee🎜🎜🎜🎜🎜 🎜Penukaran Array & JSON
Penukaran jenis
rrreeearray
sangat berguna apabila anda menyimpan data JSON bersiri dalam pangkalan data. Contohnya: Jika pangkalan data anda mempunyai jenis medanJSON
atauTEXT
yang bersiri kepada JSON dan anda menambah penukaran jenisarray
pada Eloquent anda model , maka ia akan ditukar secara automatik menjadi tatasusunan PHP apabila anda mengaksesnya.array
类型的转换非常有用。比如:如果你的数据库具有被序列化为 JSON 的JSON
或TEXT
字段类型,并且在 Eloquent 模型中加入了array
类型转换,那么当你访问的时候就会自动被转换为 PHP 数组。一旦定义了转换,你访问
rrreeeoptions
属性时他会自动从 JSON 类型反序列化为 PHP 数组。当你设置了options
属性的值时,给定的数组也会自动序列化为 JSON 类型存储:Date 转换
当使用
Setelah penukaran ditakrifkan, ia akan menyahsiri secara automatik daripada jenis JSON kepada tatasusunan PHP apabila anda mengakses atributdate
或datetime
rrreeeoptions
. Apabila anda menetapkan nilai atributoptions
, tatasusunan yang diberikan juga akan disiri secara automatik ke dalam storan jenis JSON: 🎜Penukaran tarikh🎜🎜Apabila menggunakan atributdate
ataudatetime
, anda boleh menentukan format tarikh tersebut. Format ini akan digunakan untuk mensiri model ke dalam tatasusunan atau JSON:🎜rrreee🎜Artikel ini pertama kali diterbitkan di tapak web 🎜LearnKu.com🎜. 🎜🎜
- .