簡體   English   中英

Laravel eloquent 模型模型屬性轉換(我應該轉換哪些屬性類型?)

[英]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的表中有一個名為configjson類型列,我們可以在其中存儲每個項目的其他配置元素。

就我而言,能夠將這些數據作為array處理會很有用。 因此,我們可以只處理一個簡單的array ,而不是接收stringobject 為此,我們只需:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM