首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Yii2插入忽略/插入重复项

Yii2插入忽略/插入重复项
EN

Stack Overflow用户
提问于 2015-01-30 15:44:43
回答 5查看 10.7K关注 0票数 3

我对Yii2比较陌生,到目前为止我非常喜欢它。不过,我发现了一个与数据库插入有关的问题,更具体地说,是MySQL。

问题很简单:我正在向表中插入值,并且需要检查副本,所以我的想法是在重复的键更新()、插入、忽略()或(重复键更新)上使用

这是我用于插入的代码:

代码语言:javascript
运行
复制
$db->createCommand()
->insert('sdg_fb_apps', [
'fb_id' => $app->id,
'page_id' => $page_id,
'name' => $app->name,
'app_id' => $app_id,
'app_name' => $app_name,
])
->execute();

我必须拥有唯一的键: id和app_id,如果我运行这段代码,显然会从Yii抛出一个异常。

有这个扩展,但据我所知,只适用于YII1.0:http://www.yiiframework.com/extension/rdbcommand

我还在GitHub上找到了如下代码片段:

代码语言:javascript
运行
复制
class MyQueryBuilder extends yii\db\mysql\QueryBuilder
{
    public function batchInsert($table, $columns, $rows)
    {
        $sql = parent::batchInsert($table, $columns, $rows);
        $sql .= 'ON DUPLICATE KEY UPDATE';
        return $sql;
    }
}

然而,我不明白如何扩展Querybuilder,它能通过组件吗?

我做了一个查询,看看app_id之前是否已经在数据库中,然后只在它们不存在的情况下插入,这样我就完成了我想要做的事情,但是这应该是要扩展到巨大的数字,而且这个方法可能不是最好的。

如有任何指导,将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-29 18:46:12

一年多过去了,我在这里发现了一个悬而未决的问题。我看到这有一些牵引力,所以增加一个正确的答案是好的。

在Yii2中,其思想是查找模型,检查是否存在,然后保存。该框架将自动更新或插入,下面是我从Viewlike.us - Yii2插入并忽略重复项获得的一个片段

$model = YourModel::findOne(ID);// findOne()搜索表键,您可以使用find()->where('=','column',‘name’)->one()来标识模型。if(! $model ):$model=新的YourModel();endif;$model->列_1= 'text';$model->列_2= 123;//整数$YourModel->save();

票数 2
EN

Stack Overflow用户

发布于 2018-04-14 14:20:28

从Yi2.0.14开始,就有一个upsert()方法可以用来解决这个问题。

代码语言:javascript
运行
复制
$db->createCommand()
    ->upsert(
        'sdg_fb_apps',
        [
            'fb_id' => $app->id,
            'page_id' => $page_id,
            'name' => $app->name,
            'app_id' => $app_id,
            'app_name' => $app_name,
        ],
        false
    )
    ->execute();
票数 4
EN

Stack Overflow用户

发布于 2018-02-20 15:45:31

您问题的关键是方法$db->createCommand()。在内部,它使用$commandClass公共属性,默认情况下是yii\db\Command。您可以在应用程序配置中更改它,以覆盖batchInsert()等命令方法。以下是我的应用程序的示例:

代码语言:javascript
运行
复制
'db' => [
    'class' => 'yii\db\Connection',
    'charset' => 'utf8',
    'enableSchemaCache' => YII_ENV_PROD,
    'commandClass' => 'app\db\MyCommand'
],

您的命令类看起来可能是:

代码语言:javascript
运行
复制
class MyCommand extends yii\db\Command
{
    public function batchInsert($table, $columns, $rows)
    {
        parent::batchInsert($table, $columns, $rows);
        $sql = $this->getRawSql();
        $sql .= ' ON DUPLICATE KEY UPDATE';
        $this->setRawSql($sql);

        return $this;
    }
}

但我更愿意引入单独的方法,例如batchInsertUpdate()或其他方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28239523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档