Как вставить все данные файла JSON в базу данных? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть файл JSON и в нем есть данные.Я хочу импортировать все данные в базе данных через сеялки БД.Я получаю ошибку Trying to get property name of non-object.У меня есть несколько данных, как я могу вставить в базу данных?

public function run()
{
    $json = File::get("public/kmz/WASASubdivisions.geojson");
    $data = json_decode($json);
 //        dd($data);
    foreach ($data as $obj){
        Regions::create(array(
            'name' => $obj[0]->Name,
            'description' => $obj[0]->description,
            'altitudeMode' => $obj[0]->altitudeMode,
            'Town' => $obj[0]->Town,
            'AC' => $obj[0]->AC,
            'No_of_TW' => $obj[0]->No_of_TW,
            'No' => $obj[0]->No,
            'DC'=> $obj[0]->DC,
            'HH_2017' => $obj[0]->HH_2017,
            'FID' => $obj[0]->FID,
            'Area_ha' => $obj[0]->Area_ha,
            'Field_1' => $obj[0]->Field_1,
            'Pop_Dens' => $obj[0]->Pop_Dens,
            'Id' => $obj[0]->Id,
            'Pop_2017' => $obj[0]->Pop_2017,
            'Area_Sq'=> $obj[0]->Area_Sq,
        ));
    }
}

Образец Json Format

31 => {#837
  +"type": "Feature"
  +"properties": {#838
    +"Name": "Gujjar Pura"
    +"description": null
    +"altitudeMode": "clampToGround"
    +"Town": "Shalimar Town"
    +"AC": "31"
    +"No_of_TW": "11"
    +"No": "13"
    +"DC": "38"
    +"HH_2017": "30478"
    +"FID": "31"
    +"Area_ha": "648.327"
    +"Field_1": "Gujjar Pura"
    +"Pop_Dens": "54063.141167"
    +"Id": "0"
    +"Pop_2017": "196619"
    +"Area_Sq": "3.63684"
  }
  +"geometry": {#839
    +"type": "MultiPolygon"
    +"coordinates": array:1 [
      0 => array:1 [
        0 => array:169 [ …169]
      ]
    ]
  }
}

Ответы [ 4 ]

1 голос
/ 14 июня 2019
public function run()
{
    $json = File::get("public/kmz/WASASubdivisions.geojson");
    $data = json_decode($json);
    dd($data);
    foreach ($data as $obj){
        Regions::create(array(
            'name' => $obj->Name,
            'description' => $obj->description,
            'altitudeMode' => $obj->altitudeMode,
            'Town' => $obj->Town,
            'AC' => $obj->AC,
            'No_of_TW' => $obj->No_of_TW,
            'No' => $obj->No,
            'DC'=> $obj->DC,
            'HH_2017' => $obj->HH_2017,
            'FID' => $obj->FID,
            'Area_ha' => $obj->Area_ha,
            'Field_1' => $obj->Field_1,
            'Pop_Dens' => $obj->Pop_Dens,
            'Id' => $obj->Id,
            'Pop_2017' => $obj->Pop_2017,
            'Area_Sq'=> $obj->Area_Sq,
        ));
    }
}
0 голосов
/ 14 июня 2019

Атрибуты находятся под ключом properties, но вы ссылаетесь на них из корня объекта.например, $obj[0]->Name должно быть $obj[0]->properties->Name и т. д.

0 голосов
/ 14 июня 2019

Давайте поддержим, у меня есть модель Post, и я хочу сохранить дополнительные данные в формате JSON в таблице записей. В этом случае мы можем использовать свойство $casts в Laravel. Что приведёт значение нашего поля к тому, что мы дали.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $table='posts';

    protected $fillable = ['user_id', 'title', 'short_description', 'description', 'status', 'json_data'];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'json_data' => 'array',
    ];
}

Теперь мы хотим сохранить данные примерно так

$data = [
    'user_id' => 1,
    'title' => 'abc',
    'short_description' => 'test',
    'description' => 'test',
    'status' => true,
    'json_data' => [
        'additional_info' => '',
        'post_image' => '',
        ...
    ],
];

$item = new Post;
$item->fill($data)->save();

Это сохранит ваши значения массива json_data в формате JSON в базе данных. Но когда вы получите данные из базы данных, они автоматически преобразуют их в массив.

Для справки прочитайте это

0 голосов
/ 14 июня 2019

, поскольку я не большой поклонник обработки json как объекта

Так что json_decode примет второй аргумент, поэтому

$json = File::get("public/kmz/WASASubdivisions.geojson");
$data = json_decode($json,true);

dd($data);

foreach ($data as $obj)
    {
    Regions::create(array(
            'name' => $obj['Name'],
    'description' => $obj['description'],
    'altitudeMode' => $obj['altitudeMode'],
    'Town' => $obj['Town'],
    'AC' => $obj['AC'],
    'No_of_TW' => $obj['No_of_TW'],
    'No' => $obj['No'],
    'DC'=> $obj['DC'],
    'HH_2017' => $obj['HH_2017'],
    'FID' => $obj['FID'],
    'Area_ha' => $obj['Area_ha'],
    'Field_1' => $obj['Field_1'],
    'Pop_Dens' => $obj['Pop_Dens'],
    'Id' => $obj['Id'],
    'Pop_2017' => $obj['Pop_2017'],
    'Area_Sq'=> $obj['Area_Sq'],
        ));
    }

МожетВы публикуете dd () наборы результатов и файлов таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...