6
6
7
7
use InvalidArgumentException ;
8
8
use Yiisoft \Db \Exception \NotSupportedException ;
9
- use Yiisoft \Db \Expression \Expression ;
10
9
use Yiisoft \Db \Expression \ExpressionInterface ;
11
10
use Yiisoft \Db \Query \QueryInterface ;
12
11
use Yiisoft \Db \QueryBuilder \AbstractDMLQueryBuilder ;
13
12
use Yiisoft \Db \Schema \TableSchema ;
14
13
15
14
use function array_combine ;
16
15
use function array_diff ;
16
+ use function array_fill_keys ;
17
17
use function array_intersect ;
18
+ use function array_intersect_key ;
18
19
use function array_key_exists ;
19
20
use function array_keys ;
20
21
use function array_map ;
@@ -74,15 +75,8 @@ public function upsert(
74
75
return $ this ->insert ($ table , $ insertColumns , $ params );
75
76
}
76
77
77
- if ($ updateColumns === true ) {
78
- $ updateColumns = [];
79
- /** @psalm-var string[] $updateNames */
80
- foreach ($ updateNames as $ name ) {
81
- $ updateColumns [$ name ] = new Expression ('EXCLUDED. ' . $ this ->quoter ->quoteSimpleColumnName ($ name ));
82
- }
83
- }
84
-
85
- if (empty ($ updateColumns )) {
78
+ if (empty ($ updateColumns ) || $ updateNames === []) {
79
+ /** there are no columns to update */
86
80
$ insertSql = $ this ->insert ($ table , $ insertColumns , $ params );
87
81
return 'INSERT IGNORE ' . substr ($ insertSql , 6 );
88
82
}
@@ -92,21 +86,15 @@ public function upsert(
92
86
$ quotedNames = array_map ($ this ->quoter ->quoteColumnName (...), $ names );
93
87
94
88
if (!empty ($ placeholders )) {
95
- $ selectValues = [];
96
-
97
- foreach ($ placeholders as $ i => $ placeholder ) {
98
- $ selectValues [] = "$ placeholder AS $ quotedNames [$ i ]" ;
99
- }
100
-
101
- $ values = 'SELECT ' . implode (', ' , $ selectValues );
89
+ $ values = $ this ->buildSimpleSelect (array_combine ($ names , $ placeholders ));
102
90
}
103
91
104
92
$ fields = implode (', ' , $ quotedNames );
105
93
106
94
$ insertSql = 'INSERT INTO ' . $ this ->quoter ->quoteTableName ($ table )
107
95
. " ( $ fields) SELECT $ fields FROM ( $ values) AS EXCLUDED " ;
108
96
109
- $ updates = $ this ->prepareUpdateSets ($ table , $ updateColumns , $ params );
97
+ $ updates = $ this ->prepareUpsertSets ($ table , $ updateColumns, $ updateNames , $ params );
110
98
111
99
return $ insertSql . ' ON DUPLICATE KEY UPDATE ' . implode (', ' , $ updates );
112
100
}
@@ -140,13 +128,8 @@ public function upsertReturning(
140
128
141
129
if (empty ($ uniqueColumns )) {
142
130
$ returnValues = $ this ->prepareColumnValues ($ tableSchema , $ returnColumns , $ insertColumns , $ params );
143
- $ selectValues = [];
144
-
145
- foreach ($ returnValues as $ name => $ value ) {
146
- $ selectValues [] = $ value . ' AS ' . $ quoter ->quoteSimpleColumnName ($ name );
147
- }
148
131
149
- return $ upsertSql . ';SELECT ' . implode ( ' , ' , $ selectValues );
132
+ return $ upsertSql . '; ' . $ this -> buildSimpleSelect ( $ returnValues );
150
133
}
151
134
152
135
if (is_array ($ updateColumns ) && !empty (array_intersect ($ uniqueColumns , array_keys ($ updateColumns )))) {
@@ -172,13 +155,9 @@ public function upsertReturning(
172
155
$ uniqueValues = $ this ->prepareColumnValues ($ tableSchema , $ uniqueColumns , $ insertColumns , $ params );
173
156
174
157
if (empty (array_diff ($ returnColumns , array_keys ($ uniqueValues )))) {
175
- $ selectValues = [];
176
-
177
- foreach ($ returnColumns as $ name ) {
178
- $ selectValues [] = $ uniqueValues [$ name ] . ' AS ' . $ quoter ->quoteSimpleColumnName ($ name );
179
- }
158
+ $ selectValues = array_intersect_key ($ uniqueValues , array_fill_keys ($ returnColumns , null ));
180
159
181
- return $ upsertSql . ';SELECT ' . implode ( ' , ' , $ selectValues );
160
+ return $ upsertSql . '; ' . $ this -> buildSimpleSelect ( $ selectValues );
182
161
}
183
162
184
163
$ conditions = [];
0 commit comments