laravel 设置属性不会附加到 json 键

Posted

技术标签:

【中文标题】laravel 设置属性不会附加到 json 键【英文标题】:laravel set attribute won't append to json key 【发布时间】:2017-01-22 05:00:56 【问题描述】:

我有一个循环设置一些 json 值。

 if (isset($product->customfields)) 
            foreach ($product->customfields as $customfield) 
                $fieldId = $customfield['custom_field_id'];
                // Grab custom field template code
                $field = CustomField::find($fieldId);

                $product->attributes['display_name'] = $field->display_name;

            

我试图添加的显示名称在这里

$product->attributes['display_name'] = $field->display_name;

在我的转储中,我可以看到这样的 json

 "id":"20",
 "display_name":"Size",
   "customfields":[  
        
         "id":"1",
         "product_id":"20",
         "store_id":null,
         "custom_field_id":"1",
         "value":"RED",
         "created_at":"2016-09-14 09:32:00",
         "updated_at":"2016-09-14 09:32:14"
      ,

但是当我尝试更改为任何一个时

 $product->attributes['customfields']['display_name'] = $field->display_name;


 $product->attributes['customfields'] = $field->display_name;

我刚刚得到这个

"id":"20",
"customfields":[  
        
         "id":"1",
         "product_id":"20",
         "store_id":null,
         "custom_field_id":"1",
         "value":"RED",
         "created_at":"2016-09-14 09:32:00",
         "updated_at":"2016-09-14 09:32:14"
      ,

如何设置要添加到 customfields 键的属性?

编辑:

完整文件http://kopy.io/LQTDi

感谢@Manish 的建议

$product->customfields-['display_name'] = $field->display_name;

现在返回

"customfields":  
      "0":  
         "id":"1",
         "product_id":"10000",
         "store_id":null,
         "custom_field_id":"1",
         "value":"RED",
         "created_at":"2016-09-14 09:32:00",
         "updated_at":"2016-09-14 09:32:14"
      ,
      "1":  
         "id":"2",
         "product_id":"10000",
         "store_id":null,
         "custom_field_id":"2",
         "value":"",
         "created_at":"2016-09-14 10:22:14",
         "updated_at":"2016-09-14 10:22:14"
      ,
      "display_name":"Size"
   ,

但是在自定义显示名称中有两个字段,分别是大小和颜色。我想我可能需要创建一个新循环并循环显示名称。如果是这种情况,请建议,我会这样做。

【问题讨论】:

我很惊讶它甚至可以工作,因为Eloquent\Model 类中的attributes 属性受到保护。你应该得到错误Indirect modification of overloaded property 或类似的东西。你确定你没有抑制该代码中的任何错误吗? 出现错误。但是我使用的是 OcotberCMS,所以可能与上面的代码实际工作有关。 确实如此。 OctoberCMS 改变属性可见性github.com/octobercms/library/blob/master/src/Database/… 你试过这样$product->customfields['display_name'] = $field->display_name; @Manish 这有点工作,它在自定义字段中添加显示名称,但不在 id“1”中。当我有多个自定义值时,它将进入自定义字段:[ “id”:1 、“id”:2 等。如何在每个对象中循环每个 display_name? 【参考方案1】:

我知道这是旧的,但this answer your question?

$product->setAttribute ('customfields->display_name', 'Display name of my column');

但是,退后一步,完全绕开您的问题,有人可能会争辩说您根本不想在数据库模型中硬编码显示名称。显示名称应该在您的翻译/本地化文件中进行管理。

在您的 Blade 模板文件中,尝试:

 __($my_field_id) 

然后您将在本地化文件中为您的field-id 提供翻译。

【讨论】:

【参考方案2】:

@ServerSideSkittles 也许我明白你的意思。可能是我错了,但根据您的详细信息,我认为您需要这个。

if (isset($product->customfields)) 

                foreach ($product->customfields as $customfieldKey => $customfieldVal) 
                    $fieldId = $customfieldVal['custom_field_id'];
                    // Grab custom field template code
                    $field = CustomField::find($fieldId);

                    $product->customfields[$customfieldKey]['display_name'] = $field->display_name;
                
    

试试这个。可能这会解决问题。

【讨论】:

这太棒了!我正在重新编辑我的问题,你发布了这个宝石。非常感谢,因为我没有很好地解释这个问题。

以上是关于laravel 设置属性不会附加到 json 键的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript将属性附加到对象[重复]

JavaScript将属性附加到对象[重复]

如何使用 barryvdh/laravel-dompdf 将 PDF 附加到 Laravel 的电子邮件中

Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中

尝试将翻译键值的 json 从 laravel 刀片传递到 vue.js 时出现问题

向 laravel 中的资源 json 响应添加状态和消息键