【问题标题】:Laravel Eloquent: inserting dataLaravel Eloquent:插入数据
【发布时间】:2015-09-19 00:38:51
【问题描述】:

我正在通过post方法发送一堆数据。现在我正在使用一个完全有效的解决方案:

$dataClient = new Client;
$dataClient->name    = $post['client']['name'];
$dataClient->address = $post['client']['address'];
...
$dataClient->save();        

我想知道是否有更短的解决方案?就像发布一个数组和 Laravel 可以将键映射到 db 字段一样?

如果您要添加更多内容,例如计算值,该怎么办?

例子:

$dataClient = new Client;
Then map array keys to db keys
$dataClient->someField = someCalculatedValue 
$dataClient->save();

提前谢谢你。

【问题讨论】:

  • 必须是Eloquent还是可以使用QueryBuilder
  • 我更喜欢 Eloquent。这样我可以保持关系,例如创建日期。

标签: laravel eloquent


【解决方案1】:

在从数据数组创建模型时,您有很多选择。如果要直接插入数据库,最简单的方法是create()

Client::create($post['client']);

如果您想在之后更改某些内容或只是不立即保存,只需将您的数据传递给构造函数即可。

$client = new Client($post['client']);
$client->someField = 'some value';
$client->save();

最后,最后一个选项,手动调用fill()。此方法在内部用于create() 以及构造函数中。

$client = new Client();
$client->fill($post['client']);
$client->save();

注意:对于上述所有方法,您需要在模型中设置fillable 属性。这是为了防止恶意用户输入(请求数据)。

protected $fillable = ['name', 'address', 'etc'];

More information about Mass Assignment

【讨论】:

  • lukasgeiter 谢谢你的回答。你能再举一个批量分配漏洞的例子吗?
  • 这是一个简单的例子:假设您有一个字段is_admin。现在您可以将请求数据直接传递给模型,它只会保存任何人可以通过操作请求数据并添加is_admin=1 来让自己成为管理员的所有值
【解决方案2】:

你尝试过这样的事情吗?

$dataClient = new Client;
$dataClient->fill($client);
$dataClient->save();

根据您设置客户端模型的方式以及设置为受保护/可填充的字段,填充方法将自动将数据与其各自的字段映射。

【讨论】:

    【解决方案3】:

    Eloquent 有 create and update 方法,可以插入大量数据。例如:

    inputs = ['name' => 'value','address' => 'value'];
    Client::create(inputs)
    

    它会自动映射 Eloquent 中的字段。

    【讨论】:

    • 你需要注意被保护的/可填充的
    猜你喜欢
    • 2019-05-25
    • 2019-06-24
    • 1970-01-01
    • 2019-08-01
    • 2020-10-21
    • 2016-06-30
    • 2014-11-02
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多