Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.2更新/插入批次与Codeigniter的更新/插入批次相似()_Php_Database_Codeigniter_Laravel_Laravel 5 - Fatal编程技术网

Php Laravel 5.2更新/插入批次与Codeigniter的更新/插入批次相似()

Php Laravel 5.2更新/插入批次与Codeigniter的更新/插入批次相似(),php,database,codeigniter,laravel,laravel-5,Php,Database,Codeigniter,Laravel,Laravel 5,laravel是否具有类似于Codeigniter的更新批处理功能 Codeigniter使用$this->db->update_batch'mytable',$data'title';执行批处理更新。可以找到更多信息 但对于拉威尔来说,似乎它只能做一笔交易。我觉得当您有多行要更新,其中它将位于for循环中时,这有点糟糕。类似于此: foreach ($rows => $row) { DB::table('users')->where('id', $row['row_id']

laravel是否具有类似于Codeigniter的更新批处理功能

Codeigniter使用$this->db->update_batch'mytable',$data'title';执行批处理更新。可以找到更多信息

但对于拉威尔来说,似乎它只能做一笔交易。我觉得当您有多行要更新,其中它将位于for循环中时,这有点糟糕。类似于此:

foreach ($rows => $row) {
    DB::table('users')->where('id', $row['row_id'])->update(['votes' => 1]);
}
至少你明白了,对吧


如果您仔细查看这段代码,您的数据库可能会因为继续连接而被破坏。与更新批处理不同,只抛出一个事务。

查看数据库事务

TL;DR-不清楚CodeIgniter CI方法是否比一系列更新查询更有效。此外,CI方法不如一系列循环更新清晰

说Laravel继续连接是不正确的——它将在请求开始时打开一个连接,并继续使用该连接,直到请求完成。我想你的意思是,你正在向服务器发送大量的查询

确实,这样做:

INSERT INTO table VALUES (1, ...);
INSERT INTO table VALUES (2, ...);
INSERT INTO table VALUES (3, ...);
...
INSERT INTO table VALUES (n, ...);
INSERT INTO table VALUES (1, ...),
(2, ...),
(3, ...),
...
(n, ...);
将比这样做效率更低:

INSERT INTO table VALUES (1, ...);
INSERT INTO table VALUES (2, ...);
INSERT INTO table VALUES (3, ...);
...
INSERT INTO table VALUES (n, ...);
INSERT INTO table VALUES (1, ...),
(2, ...),
(3, ...),
...
(n, ...);
但这不是一个简单的插入。查看您发布的链接中CI库生成的代码。我们所关注的是以下两个方面的效率差异:

UPDATE table SET value=1 WHERE id=1;
UPDATE table SET value=2 WHERE id=2;
UPDATE table SET value=3 WHERE id=3;
...
UPDATE table SET value=n WHERE id=n;

我不是SQL专家,但我不相信第二种方法比第一种更有效。SQL server将处理一长串的WHE子句——我认为一堆简短的UPDATE语句将更有效,特别是当您在WHERE子句中使用索引列时

最后,查看CI文档,update\u batch方法对传递给它的数据的结构进行了一些假设—例如,数组中的第一项是update语句的键。这对我来说至少在六个月后查看代码时是不清楚的。

也许这会有所帮助

trait InsertOrUpdate {
static function InsertOrUpdate(array $rows) {
    $table = DB::getTablePrefix().with(new self)->getTable();
    if (empty($table)) {
        return false;
    }
    $maxRowData = DB::table($table)->where('id', DB::raw('(select max(`id`) from ' . $table . ')'))->first();
    if (! empty($maxRowData)) {
        $maxId = $maxRowData->id;
        $result = DB::statement('ALTER TABLE ' . $table . ' AUTO_INCREMENT = ' . $maxId . ';');
    }
    $tableColumns = DB::getSchemaBuilder()->getColumnListing($table);
    $datetime = Carbon::now()->toDateTimeString();
    if (in_array('created_at', $tableColumns)) {
        foreach ($rows as $key => $row) {
            $rows[$key]['created_at'] = $datetime;
            $rows[$key]['updated_at'] = $datetime;
        }
    }
    $first = reset($rows);
    $columns = implode(',',
        array_map(function($value) {
            return "$value";
        },
        array_keys($first))
    );

    $values = implode(',', array_map(function($row) {
            return '('.implode( ',',
                array_map(function($value) { return '"' . str_replace('"', '""', $value) . '"'; }, $row)
            ).')';
        } , $rows)
    );

    $updates = '';
    if (in_array('updated_at', $tableColumns)) {
        unset($first['created_at']);
        unset($first['updated_at']);
        $first['deleted_at'] = NULL;

        $updateString = '(CASE WHEN ';
        $lastClolumn = count($first);
        $columnNum = 1;
        foreach (array_keys($first) as $column) {
            $updateString .= $column . ' <> VALUES(' . $column . ')';
            if ($columnNum != $lastClolumn) {
                $updateString .= ' OR ';
            }
            $columnNum++;
        }
        $updateString .= ' THEN \'' . $datetime . '\' ELSE `updated_at` END), ';
        $updates .= 'updated_at = ' . $updateString;
    }
    $updates .= implode(',',
        array_map(function($value) {return "$value = VALUES($value)"; } , array_keys($first) )
    );
    $sql = "INSERT INTO {$table}({$columns}) VALUES {$values} ON DUPLICATE KEY UPDATE {$updates};";
    return DB::statement($sql);
}

当您有多个事务时,会使用事务,例如update然后执行插入/删除等。我尝试的是只使用一条update语句,它可以同时更新多行。看起来您可能必须使用原始表达式。许多更新与何时:我测试了这一点,在我的案例中,答案是平衡是必要的。最慢的是不使用时和大量使用时。最快的方法是使用少量WHEN ie small chunks.Btw,这样会更有效率,特别是当您在WHERE子句中使用索引列时——这两种情况都是如此。