[英]Laravel 5.4: Eloquent sync() not using model's mutator or attribute casting?
[英]Laravel eloquent model model attribute casting (Which attribute types should I cast?)
我不確定我是否完全理解 Laravel Eloquent 屬性轉換。 根據文檔( https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting ),這些是支持的類型:
整數、實數、浮點數、雙精度數、十進制數:、字符串、布爾值、對象、數組、集合、日期、日期時間、時間戳、加密、加密:對象、加密:數組和加密:集合
到目前為止,我只在我的模型上使用了日期轉換(當字段作為時間戳存儲在數據庫中時),如下所示:
protected $dates = [
'modified_at', 'published_at'
];
我也理解當值存儲為整數(0 或其他)時需要將屬性轉換為布爾值。
但是對於其他屬性類型(例如整數),我應該總是進行屬性轉換嗎? 或者只是當數據庫中的字段屬於不同類型時? 有哪些用例或其他屬性的最佳實踐是什么?
(例如,我無法想象在遷移中創建一個字符串字段,然后將其中的一些數字保存為字符串,然后將其轉換回模型上的整數?)
默認情況下,屬性將轉換為表中定義的列類型。 因此,如果您的列是整數,那么它將被轉換為int
。
但是,如果您想為特定字段修改此行為,會發生什么? 那是屬性轉換進入場景的時候。
例如,假設我們在名為projects
的表中有一個名為config
的json
類型列,我們可以在其中存儲每個項目的其他配置元素。
就我而言,能夠將這些數據作為array
處理會很有用。 因此,我們可以只處理一個簡單的array
,而不是接收string
或object
。 為此,我們只需:
class Project extends Model
{
// ...
protected $casts = [
'config' => 'array',
];
// ...
}
這樣,每當我們使用 Eloquent 從數據庫中獲取項目時,每條記錄都會將該屬性作為array
。 而且,在嘗試存儲/更新記錄時,它將被轉換回json
。
與您指定的情況相關(將元素保存為string
,然后將其作為integer
檢索)當然是完全可能的。 您需要為該字段設置訪問器和修改器。 對於名為number
的屬性:
/**
* This will be called when fetching the element.
*/
public function getNumberAttribute($value)
{
return (int)$value;
}
/**
* This will be called when storing/updating the element.
*/
public function setFirstNameAttribute($value)
{
$this->attributes['number'] = (string)$value;
}
現在,有理由需要這樣做嗎? 好吧,您可能正在處理設計不當的數據庫,或者處理多個系統正在使用的生產數據庫,並且數據庫中的更改很難完成。 在這些情況下,您可以利用這種值操作在您的應用程序中隨心所欲地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.