【问题标题】:How to use insert in query builder insert multiple records?如何在查询生成器中使用插入插入多条记录?
【发布时间】:2014-10-27 16:03:30
【问题描述】:

我正在 CakePHP 3 中尝试以下操作:

   $newUsers = [
        [
            'username' => 'Felicia',
            'age' => 27,
        ],
        [
            'username' => 'Timmy',
            'age' => 71,
        ],
    ];

    $insertQuery = $this->Users->query();

    $insertQuery->insert(array_keys($newUsers[0]))
                ->values($newUsers)
                ->execute();

我收到以下错误:

Error: SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1

SQL Query: INSERT INTO users (username, age) VALUES (:c0, :c1, :c2, :c3) 

我期待 INSERT INTO users (username, age) VALUES (:c0, :c1), (:c2, :c3); 作为查询。

我打开了数据库配置的日志,我看到了:

2014-10-27 16:10:26 Debug: INSERT INTO users (username, age) VALUES (NULL, NULL, 'Array', 'Array')

如果我误解了在 CakePHP 3.x 中使用查询生成器的潜力,请帮助我理解

【问题讨论】:

    标签: mysql cakephp cakephp-3.0


    【解决方案1】:

    刚刚测试过。这行得通。

       $newUsers = [
            [
                'username' => 'Felicia',
                'age' => 27,
            ],
            [
                'username' => 'Timmy',
                'age' => 71,
            ],
        ];
    
        $columns = array_keys($newUsers[0]);
    

    警告!有两种方法可以进行批量插入。这是一种方式:

        $insertQuery = $this->Users->query();
    
        $newUsersValuesExpression = new ValuesExpression($columns, $insertQuery->typeMap()->types([]));
        $newUsersValuesExpression->values($newUsers);
    
        $insertQuery->insert($columns)
                    ->values($newUsersValuesExpression)
                    ->execute();
    

    按照 ndm 的建议,我更喜欢这种方式。

        $insertQuery = $this->Users->query();
    
        $insertQuery->insert($columns);
    
        // you must always alter the values clause AFTER insert
        $insertQuery->clause('values')->values($newUsers);
    
        $insertQuery->execute();
    

    【讨论】:

    • 你的第二种方法在 Cakephp 3.0 中对我有用
    • @kim - 如何在查询执行后获取所有插入的数据?像这种返回插入数据的插入方法 $this->saveMany($this->newEntities($inser_data));
    【解决方案2】:

    您可以合并多个value() 调用:

    // ...
    
    foreach($newUsers as $values)
    {
        $query->values($values);
    }
    $query->execute();
    

    或直接修改ValuesExpression 对象(可通过Query::clause() 访问),它有一个values() 方法,允许一次设置所有数据:

    // ...
    
    $query->clause('values')->values($newUsers);
    $query->execute();
    

    【讨论】:

    • 我认为您的措辞并不完全正确,但谢谢!您确实向我指出了派生 ValuesExpression 的另一种方法
    • @KimStacks 您认为措辞有误吗?调用insert() 后需要应用值这一缺失的事实?这通常是它必须完成的方式。另请注意,无需重新应用 ValuesExpression 实例。
    • 抱歉,您是对的。我会改变我的答案。伙计,你很好。您使用 Cake3 多长时间了?
    • @KimStacks 我还没有真正使用(就像在实际项目中使用它)CakePHP 3,我只是在这里和那里测试特定的东西,但是我一直在关注开发开始了,我在 GitHub 上查看所有问题和拉取请求,偶尔贡献代码和修复程序,最后但并非最不重要的是,我正在尝试解决这里的人们在 SO 上遇到的问题(当然,当我实际上应该工作时),这是我熟悉代码的方式。不,我没有博客,我的公开活动仅限于 SO 和 GitHub
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2011-11-22
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多