Как сохранить и получить вложенный массив JSON в laravel 6 - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь получить данные, сохраненные как json в mysql. Моя миграция выглядит следующим образом:

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
                    }
                ]
            }
        ]
    }
}

Теперь я пытаюсь получить цену ' whiteOne 'под' белый соус 'и не получаю ничего, кроме нулевого или 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
        }
      ]
    }
  ]
}

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 20 февраля 2020

Я использовал эту функцию для получения значения индекса.

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>";
...