How can I convert json to a Laravel Eloquent Model?

后端 未结 5 1490
無奈伤痛
無奈伤痛 2021-02-20 02:43

if I have an Eloquent Model called Post, and the mysql table has:

integer ID, string Text

How do I convert this JSon:

{ post: { text: \'my text\'         


        
相关标签:
5条回答
  • 2021-02-20 03:05

    fill looks like the method you want. To avoid adding every attribute to your $filled array, which you would need to do if you wanted to use the fill method, you can use the forceFill method.

    It accepts an associative array of attributes, so the JSON will have to be decoded, and we'll have to get the inner post key:

    $rawJson = "{ post: { text: 'my text' } }";
    $decodedAsArray = json_decode($rawJson, true);
    $innerPost = $decodedAsArray['post'];
    

    Once we have the decoded data, we can create an instance of the Post eloquent model and call forceFill on it:

    $post = new Post();
    $post->forceFill($innerPost);
    $post->save();
    

    This is similar to doing:

    $post = new Post();
    foreach ($innerPost as $key => $value) {
        $post->$key = $value;
    }
    $post->save();
    
    0 讨论(0)
  • 2021-02-20 03:13
    1. Convert json to array
    2. Hydrate model from array

      $data = '{  
                  "unique_id_001":{"name":"John","email":"JD@stackoverflow.com"},
                  "unique_id_002":{"name":"Ken","email":"Ken@stackoverflow.com"}
                }';
      $object = (array)json_decode($data);
      $collection = \App\User::hydrate($object);
      $collection = $collection->flatten();   // get rid of unique_id_XXX
      
      /*
          Collection {#236 ▼
            #items: array:2 [▼
              0 => User {#239 ▶}
              1 => User {#240 ▶}
            ]
          }
       */
      dd($collection);
      
    0 讨论(0)
  • 2021-02-20 03:13

    Just turn it to array and fill an eloquent

    $arr = json_decode($json, true);
    $post = new Post;
    $post->fill($arr);
    
    0 讨论(0)
  • 2021-02-20 03:23

    It's way simple as like followings:

    $json_post = { "post": { "text": "my text" } };
    
    $post = new Post(
        json_decode($json_post, true)
    );
    

    Now, you can run all eloquent methods on the most $post, ex:

    $post->save()
    

    I tested with laravel v7.11.0

    0 讨论(0)
  • 2021-02-20 03:27

    Can you try it like this?

    public function store($poststuff)
    {
        $post = new Post;
        $post->text = $poststuff['text'];
        $post->save();
    }
    
    0 讨论(0)
提交回复
热议问题