如何在 laravel 6 中存储和检索嵌套的 JSON 数组

Posted

技术标签:

【中文标题】如何在 laravel 6 中存储和检索嵌套的 JSON 数组【英文标题】:How to store and retrieve nested JSON array in laravel 6 【发布时间】:2020-06-03 11:48:16 【问题描述】:

我正在尝试检索在 mysql 中保存为 json 的数据。我的迁移如下所示:

Schema::create('items', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->string('name')->nullable();
        $table->json('add_ons')->nullable();
        $table->timestamps();
    );

我试过从邮递员那里保存下面的 JSON,它保存得很好。


    "itemName": "chicken",
    "addons": 
        "required": false,
        "min": 2,
        "max": 3,
        "data": [
            
                "name": "sauces",
                "type": [
                    
                        "name": "white sauce",
                        "type": [
                            
                                "name": "whiteOne",
                                "price": 10
                            ,
                            
                                "name": "whiteTwo",
                                "price": 20
                            
                        ]
                    ,
                    
                        "name": "red sauce",
                        "price": 10
                    
                ]
            
        ]
    

现在,我尝试在 'white sauce' 下检索 'whiteOne' 的价格,除了 null 或 laravel 错误响应之外什么都没有。

我试过了

Item::whereJsonContains('add_ons->data->name','sauces')->get()
Item::whereJsonContains('add_ons->data->name','sauces')->find(16)

保存后'add_ons'列有以下数据:


  "required": false,
  "min": 2,
  "max": 3,
  "data": [
    
      "name": "sauces",
      "type": [
        
          "name": "white sauce",
          "type": [
            
              "name": "whiteOne",
              "price": 10
            ,
            
              "name": "whiteTwo",
              "price": 20
            
          ]
        ,
        
          "name": "red sauce",
          "price": 10
        
      ]
    
  ]

谁能帮帮我?

【问题讨论】:

我认为这是 add_ons->data 的拼写错误 - 它必须是 add_ons->addons->data 感谢您纠正其中一个问题。尝试了你的建议,但它不起作用。@RobinGillitzer 你会得到什么:Item::whereJsonContains('add_ons->itemName','chicken')->get(); Illuminate\Database\Eloquent\Collection #306 ▼ #items: [] @RobinGillitzer 你的 MySQL 版本是多少? 【参考方案1】:

我使用这个函数来获取索引的值。

public function search($array, $key, $value)  
        // RecursiveArrayIterator to traverse an 
        // unknown amount of sub arrays within 
        // the outer array. 
        $arrIt = new \RecursiveArrayIterator($array); 

        // RecursiveIteratorIterator used to iterate 
        // through recursive iterators 
        $it = new \RecursiveIteratorIterator($arrIt); 

        foreach ($it as $sub)  

            // Current active sub iterator 
            $subArray = $it->getSubIterator(); 

            if ($subArray[$key] === $value)  
                //$result[] = iterator_to_array($subArray); 
                $result = iterator_to_array($subArray); 
              
         
        return $result; 
    

现在,当我在函数中传递值时,我得到了适当的值。

$item = Item::where('id','=',16)->first();
$res = $this->search($item->add_ons['data'], 'name', 'whiteTwo'); 
echo $res["name"]." - ".$res['price'] ."<br>";

【讨论】:

以上是关于如何在 laravel 6 中存储和检索嵌套的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中存储和检索常量

如何从没有关系laravel 8的另一个表中检索具有多行的行数据

如何避免 laravel(php) 中的嵌套查询?

如何在 qml 中没有 listmodel 的情况下存储嵌套 ListView 的数据并在之后检索

如何检索存储在 select2 下拉列表中的数据?

如何查找与嵌套键 laravel mongodb jenssegers 匹配的记录