仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录
Posted
技术标签:
【中文标题】仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录【英文标题】:Laravel Eloquent Insert Multiple records only if one field is provided as an array 【发布时间】:2018-03-26 21:34:42 【问题描述】:如果只提供一个字段作为数组,Laravel / Eloquent 是否提供了一种通过一次调用创建多条记录的方法?
例如,我得到 $request 并带有下面的数据,但只有 propIds 会被分解并作为数组提供,所有其他值对于所有新记录都是相同的。
"_token": "kEKmrPzu4nCk35xJAMOgdl0kNdwUZvpECsBl91dH",
"propIds": "126,129,71,82,77,64,69",
"rate": "4",
"cost": "55"
我可以做一个 foreach 并构建一个数组,然后运行 Model::insert($newArray);
但也许 Laravel 确实提供了一个解决方案,如果只提供一个字段作为数组。谢谢。
现在我只是使用 foreach 循环创建数组,然后调用 Model::insert($newArray);
使用Model::insert($newArray);
插入多条记录不会自动添加 created_at 和 updated_at 日期。我在数据库中添加了一个时间戳作为默认值。
【问题讨论】:
不,您必须提供所有字段值。只需在插入之前映射它们。 【参考方案1】:是的,这是可能的。您需要使用insert()
并使用以下格式创建一个新数组:
Model::insert([
['prop_id' => 126, 'rate' => 4, 'cost' => 55],
['prop_id' => 129, 'rate' => 4, 'cost' => 55],
['prop_id' => 71, 'rate' => 4, 'cost' => 55],
]);
insert()
将只创建一个数据库查询。
【讨论】:
【参考方案2】:您可以覆盖 Laravel 模型 create
函数,如下所示:
型号
namespace App\Models;
class YourModel extends BaseModel
protected $fillable = [
"_token", "propId", "rate", "cost"
];
// override
public static function create(array $attributes = [])
$propIds = array_explode(',', $attributes['propIds']);
foreach ($propIds as $key => $value)
$model = new static([
"_token" => $attributes['_token'],
"propId" => $value,
"rate" => $attributes['rate'],
"cost" => $attributes['cost']
]);
$model->save();
控制器
YourModel::create([
"_token" => $request->input('_token'),
"propIds" => $request->input('propIds'), // "126,129,71,82,77,64,69"
"rate" => $request->input('rate'),
"cost" => $request->input('cost'),
]);
【讨论】:
我认为定义一个新方法会更有意义,例如createMany
,它在内部利用现有的create
方法。这使得原始的 create
方法保持不变,以供将来可能需要的情况使用。以上是关于仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录的主要内容,如果未能解决你的问题,请参考以下文章
牛客 - Elo mountains(AC自动机+可持久化数组优化)