我对Yii2比较陌生,到目前为止我非常喜欢它。不过,我发现了一个与数据库插入有关的问题,更具体地说,是MySQL。
问题很简单:我正在向表中插入值,并且需要检查副本,所以我的想法是在重复的键更新()、插入、忽略()或(重复键更新)上使用。
这是我用于插入的代码:
$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上找到了如下代码片段:
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之前是否已经在数据库中,然后只在它们不存在的情况下插入,这样我就完成了我想要做的事情,但是这应该是要扩展到巨大的数字,而且这个方法可能不是最好的。
如有任何指导,将不胜感激。
发布于 2018-04-14 14:20:28
从Yi2.0.14开始,就有一个upsert()
方法可以用来解决这个问题。
$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();
https://stackoverflow.com/questions/28239523
复制相似问题