Check this code, use Laravel mutator and some changes in your fillUsing. Note toName, toEmail, toUrl are virtual attributes, and to_json contain json values of these columns in model!
// database\migrations\2019_08_28_045853_create_infos_table.php
...
Schema::create('infos', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
$table->string('label',100);
$table->json('to_json');
});
// app\Nova\Info.php
...
public function fields(Request $request)
{
return [
ID::make()->sortable(),
Text::make('Label'),
Text::make('To Name', 'toName')
->sortable()
->fillUsing(
function ($request, $model) {
if(!empty($request->toName)){
if(!empty($model['to_json'])){
$json = json_decode($model['to_json'],true);
}else{
$json = [];
}
$json['name'] = $request->toName;
$model['to_json'] = json_encode($json);
}
}
),
Text::make('To Email', 'toEmail')
->sortable()
->fillUsing(
function ($request, $model) {
if(!empty($request->toEmail)){
if(!empty($model['to_json'])){
$json = json_decode($model['to_json'],true);
}else{
$json = [];
}
$json['email'] = $request->toEmail;
$model['to_json'] = json_encode($json);
}
}
),
Text::make('To Url', 'toUrl')
->sortable()
->fillUsing(
function ($request, $model) {
if(!empty($request->toUrl)){
if(!empty($model['to_json'])){
$json = json_decode($model['to_json'],true);
}else{
$json = [];
}
$json['url'] = $request->toUrl;
$model['to_json'] = json_encode($json);
}
}
),
];
}
// app\Info.php
...
class Info extends Model
{
public function gettoNameAttribute(){
if(empty($this->attributes['to_json'])){
return "";
}
$json = $this->attributes['to_json'];
$result = json_decode($json,true);
if(!empty($result['name'])){
return $result['name'];
}else{
return "";
}
}
public function gettoEmailAttribute(){
if(empty($this->attributes['to_json'])){
return "";
}
$json = $this->attributes['to_json'];
$result = json_decode($json,true);
if(!empty($result['email'])){
return $result['email'];
}else{
return "";
}
}
public function gettoUrlAttribute(){
if(empty($this->attributes['to_json'])){
return "";
}
$json = $this->attributes['to_json'];
$result = json_decode($json,true);
if(!empty($result['url'])){
return $result['url'];
}else{
return "";
}
}
}