【发布时间】:2019-08-17 06:33:58
【问题描述】:
我有下面的 foreach 循环,它迭代了我的用户可以应用的一堆不同的自定义规则。
public function parse(Document $document)
{
$content = $document->text;
$rules = $document->stream->fieldrules;
foreach ($rules as $rule) {
$class = $this->getClass($rule);
$content = $class->apply($content);
//Save to database.
$fieldresult = new FieldRuleResult();
$fieldresult->create([
'field_rule_id' => $rule->field_id,
'document_id' => $document->id,
'content' => $content
]);
}
}
如您所见,我在每次迭代时都调用数据库。一些用户可能定义了多达 50 个规则,这将导致 50 个插入查询。所以我相信我可能遇到了n+1 的问题。
我想知道 - 这里的最佳做法是什么?我试过搜索 Laravel 文档,找到了 createMany 方法。所以我尝试将迭代重构为以下内容:
$result = [];
foreach($rules as $rule)
{
$class = $this->getClass($rule);
$content = $class->apply($content);
$fieldresult = new FieldRuleResult();
$result[] = [
'field_rule_id' => $rule->field_id,
'document_id' => $document->id,
'content' => $content];
}
return $rules->createMany($result);
这给了我以下错误:
Method Illuminate\Database\Eloquent\Collection::createMany does not exist.
现在我想这是因为$rules 返回了一个集合。我试图将其更改为:
return $document->stream->fieldrules()->createMany($result);
这给了我以下错误:
Call to undefined method Illuminate\Database\Eloquent\Relations\HasManyThrough::createMany()
【问题讨论】: