In this article we will learn to Store JSON in Database Laravel. Sometime in our application we have some raw information which we only want to store in our database and later on wanted to show back again. These type of information or data is only used for to keep track of records and not for any search purpose. So if the data is large and in form of array then we can store it in single column of database by serializing the array and cast it into string.
json_encode
function is used to convert a array to a json
string, so that it can be stored in a file, memory, database and also can transferred between the different networks. to save json
we need to store it in string format.
This example will work any version of laravel 5, laravel 6, laravel 7, laravel 8 and laravel 9.
So to json
encode a array
<?php
$data = json_encode(array("male", "female", "none"));
echo $data; //["male","female","none"]
?>
and for json
decode a string
<?php
$data = json_decode(["male","female","none"]);
var_dump($data); //array("male", "female", "none")
?>
Let’s understand Store Json in Database Laravel with example
Step 1: Create a laravel project
First step is to create the Laravel project using composer command or you can also read the How to install laravel 8 ? and Laravel artisan command to generate controllers, Model, Components and Migrations
composer create-project laravel/laravel crud
Step 2: Configure database
Next step is to configure the database for our project, table and data. So open .env
or if file not exist then rename .env.example file to .env
file in root folder and change below details
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=
Step 3: Create Model and Migration
If you have table and large data already then you can skip this step but if you are beginner and trying to implement autosuggestion then in this step we are creating a model and migration using artisan command
php artisan make:model User -m
Step 4 : Create a controller
Next, Create a controller and two methods one for view and another for search the suggestion as follow
php artisan make:controller UserController
Now, add the controller logic
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class UserController extends Controller
{
function index(){
return view("users.index");
}
function store(Request $request){
$validator = Validator::make($request->all(), [
'email' => 'required|email', // required and email format validation
'phone_number.*' => 'required|numeric|digits_between:9,15', // required and number field validation
'username' => 'required',
]); // create the validations
if ($validator->fails()) //check all validations are fine, if not then redirect and show error messages
{
return back()->withInput()->withErrors($validator);
// validation failed redirect back to form
}
else
{
$User = new \App\Models\User;
$User->email = $request->email;
$User->phone_number = json_encode($request->phone_number);
$User->username = $request->username;
$User->save();
return redirect()->route("users.index")
->with('success', 'You have successfully created the user.');
//handle the form
}
}
}
Here we created two methods index
for show the view and submit
method for store the json in database.
Step 5 : Create the view
Now, create a view file named as resources/views/users/index.blade.php
and put the follow code
<!DOCTYPE html>
<html>
<head>
<title>Store Json in Database Laravel - readerstacks.com</title>
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">
<h2>Store Json in Database Laravel -readerstacks.com</h2>
</div>
<div class="panel-body">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" action="{{url('users/submit')}}" name="registerform">
<div class="form-group">
<label>Email</label>
<input type="text" name="email" value="{{ old('email') }}" class="form-control" />
@csrf
</div>
<div class="form-group">
<label>Phone number</label>
<input type="text" name="phone_number[]" value="{{ old('phone_number[0]') }}" class="form-control" />
</div>
<div class="form-group">
<label>Phone number</label>
<input type="text" name="phone_number[]" value="{{ old('phone_number[1]') }}" class="form-control" />
</div>
<div class="form-group">
<label>Username</label>
<input type="text" name="username" value="{{ old('username') }}" class="form-control" [ />
</div>
<div class="form-group">
<button class="btn btn-primary">Register</button>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
Now, here we created array of phone number so that we can store them in database as string with json encode.
Step 6 : Create Route
Last and final step is to create the route for our implementation
<?php
use Illuminate\Support\Facades\Route;
Route::get('/users',"\App\Http\Controllers\UserController@index")->name('users.index');
Route::post('/users/submit',"\App\Http\Controllers\UserController@store");
Screenshot:
Store and Fetch Json using Getter and Setter
we can also achieve this by accessor
and mutator
by creating it in model then we doesn’t need to json encode it in controller as follow
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
function setPhoneNumberAttribute($value){
$this->attributes['phone_number'] = json_encode($value);
}
function getPhoneNumberAttribute(){
return json_decode($this->phone_number);
}
}