PHP - 在 foreach 循环之外保存到数据库

标签 php laravel

我有下面的 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()

最佳答案

Illuminate/Database/Query/Builder 中有一个名为 insert 的方法可用。此方法允许您在一个查询中插入多个模型。请注意,这不会像所有多合一查询方法那样触发 Eloquent 事件。

就像您已经完成的那样,将数据存储在数组中并在循环完成后执行查询。不过这次您可以使用insert

$content = 'your content here...';

$data = [];

foreach($rules as $rule) {

    $class = $this->getClass($rule);

    $content = $class->apply($content);

    $data[] = [
        // ...
        'content' => $content
    ];
}

FieldRuleResult::insert($data);

不能 100% 确定这直接适用于模型。然而在 documentation您可以找到一个带有 DB 外观的示例。

关于PHP - 在 foreach 循环之外保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55364555/

相关文章:

php - SSL3_GET_SERVER_CERTIFICATE :certificate verify failed using xampp on mac

Laravel 无法找到用户工厂

php - 如何获取已选中的单选按钮的值,jquery

php - 如何使用代码点火器框架在查询 php 中将动态对象转换为数组

php 处理来自 backbone.js 的放置请求

laravel - 我怎样才能使 Laravel/Lumen 打印控制台友好异常而不是 HTML?

php - 如何用 PHP 用大写字母分解字符串?

php - 进行多层排序的最佳/最简单方法是什么?

php - Laravel 403 此操作未经授权。验证电子邮件时

php - 在 Laravel 项目中为评论创建 Like 系统时遇到问题