【问题标题】:Casts insert on a model在模型上铸造嵌件
【发布时间】:2020-07-21 15:04:33
【问题描述】:

我正在使用 Laravel 5.4。

我已经设置了一个 $casts 数组:

protected $casts =
[
   'language_meta' => 'object'
];

但是当我插入一个数组时:

[
 "meta_page_title_cc__c" => "Historic villa for sale within moments of central Florence"
 "meta_page_title_fr__c" => null
 "meta_page_title_it_cc__c" => "Villa prestigiosa in vendita situata appena fuori il centro storico di"
 "meta_page_title_ru_cc__c" => null
 "meta_description_it_cc__c" => "Situata in uno dei sobborghi residenziali più prestigiosi di Firenze, questa straordinaria villa storica in vendita è una rara scoperta architettonica che unisce al suo interno magnifiche caratteristiche originali."
 "meta_description_fr_cc__c" => null
 "meta_description_ru_cc__c" => null
]

我在该数组上运行 json_encode 并得到:

{
"meta_page_title_cc__c": "Historic villa for sale within moments of central Florence",
"meta_page_title_fr__c": null,
"meta_page_title_it_cc__c": "Villa prestigiosa in vendita situata appena fuori il centro storico di",
"meta_page_title_ru_cc__c": null,
"meta_description
_it_cc__c ":"
Situata in uno dei sobborghi residenziali pi\u00f9 prestigiosi di Firenze,
questa straordinaria villa storica in vendita \u00e8 una rara scoperta architettonica che unisce al suo interno magnifiche caratteristiche originali.
","
meta_description_fr_cc__c ": null,
"meta_description_ru_cc__c": null
} 

然后我试图插入这个,我怀疑是因为“强制转换”,所以它会插入数据:

"{\"meta_page_title_cc__c\":\"Luxury Property For Sale near Montecatini Tuscany\",\"meta_page_title_fr__c\":null,\"meta_page_title_it_cc__c\":\"Immobili di lusso in vendita vicino Montecatini Toscana\",\"meta_page_title_ru_cc__c\":null,\"meta_description_it_cc__c\":\"Casolare con finitura di pregio in vendita - Montecatini Toscana\",\"meta_description_fr_cc__c\":null,\"meta_description_ru_cc__c\":null}"

我无法通过迁移将我的列设置为“json”,因此将该列设置为 longtext。

有没有办法通过 $casts 选项正确插入数据,然后按预期解码数据?我注意到删除 $casts 和 json 数据正确进入。

也许有一种方法可以使用 $casts 并正确存储对象?

谢谢

【问题讨论】:

    标签: php json laravel


    【解决方案1】:

    您可以像这样使用Mutators 来实现这一点:

    class MyModel extends Model
    {
        public function setLanguageMetaAttribute(array $meta)
        {
            $this->attributes['language_meta'] = json_encode($meta); // Store as json encoded string
        }
    
        public function getLanguageMetaAttribute(string $meta)
        {
            return json_decode($meta, true); // Return as associative php array
        }
    }
    

    现在你可以像这样使用它了:

        $model = MyModel::find($some_id); // Or however you want to select
        $model->language_meta = [
            "meta_page_title_cc__c" => "Historic villa for sale within moments of central Florence"
            "meta_page_title_fr__c" => null
            "meta_page_title_it_cc__c" => "Villa prestigiosa in vendita situata appena fuori il centro storico di"
            "meta_page_title_ru_cc__c" => null
            "meta_description_it_cc__c" => "Situata in uno dei sobborghi residenziali più prestigiosi di Firenze, questa straordinaria villa storica in vendita è una rara scoperta architettonica che unisce al suo interno magnifiche caratteristiche originali."
            "meta_description_fr_cc__c" => null
            "meta_description_ru_cc__c" => null
        ];
        
        $model->save(); // Persists in DB as json
    

    当你去检索它时,它已经是一个数组,所以你可以这样做:

        $model = MyModel::find($some_id); // Or however you want to select
    
        foreach ($model->language_meta as $key => $value) {
            // Whatever you want to do with the meta here
        }
    

    【讨论】:

    • @StuBlackett 如果您有任何自定义插入查询并且没有直接在模型上设置它,请注意 json_encoding。
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多