如何在Laravel中基于两个文本字段对JSON字段使用批量赋值

ymdaylpp  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(165)

在用户提交表单后,Laravel允许一种简单的方法来批量分配模型:

public function newFlightForm(Request $request)
    {   
        Flight::create($request->all());
    }

这将在数据库中创建一条新记录。
在我的例子中,我有一个name字段,它是一个JSON类型的列。有两个面向用户的输入,名称为name_enname_fr。我通过将输入解析成一个数组来解决这个问题,如下所示:

$request['name'] = [
    'en' => $request['name_en'],
    'fr' => $request['name_fr'],
];
        
Flight::create($request->all());

Laravel是否有一个内置的方法,可以将两个输入解析为JSON组合输入?

ct2axkht

ct2axkht1#

Laravel提供了一种简单的方法,可以在其模型中以原生PHP类型(如数组和JSON)的形式存储数据。使用此功能,您可以在模型上定义$casts属性,并列出应转换为JSON的属性。这样,当您创建或更新模型示例时,Laravel将自动将属性转换为指定的数据类型。
例如,您可以创建一个Flight模型,并将$casts属性设置为JSON,如下所示:

class Flight extends Model
{
    protected $casts = [
        'name' => 'json',
    ];
}

现在,当您创建或更新Flight示例时,name属性将自动转换为JSON。这意味着你可以简单地将name_en和name_fr输入传递给create方法,Laravel将为你处理到JSON的转换。例如:

Flight::create([
    'name' => [
        'en' => $request->input('name_en'),
        'fr' => $request->input('name_fr'),
    ],
    // Other attributes
]);

您还可以为模型中的name属性定义一个自定义赋值器。这样,当您检索name属性时,Laravel将自动解码JSON字符串并返回一个数组。例如:

class Flight extends Model
{
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = json_encode([
            'en' => $value['name_en'],
            'fr' => $value['name_fr'],
        ]);
    }

    public function getNameAttribute($value)
    {
        $name = json_decode($value, true);
        return [
            'name_en' => $name['en'],
            'name_fr' => $name['fr'],
        ];
    }
}

通过这种方式,您可以轻松地将属性以原生PHP类型(如数组和JSON)的形式存储在模型中。这对于存储需要以某种方式处理的数据(例如语言翻译)特别有用。使用Laravel的casting功能,您可以轻松创建复杂的数据结构并将其存储为JSON。

相关问题