public function up() { $this->createTable('user_profile', ['id' => 'pk', 'email' => Schema::TYPE_STRING, 'phone' => Schema::TYPE_STRING]); $this->createTable('department', ['id' => 'pk', 'name' => Schema::TYPE_STRING]); $this->createTable('user', ['id' => 'pk', 'profileId' => "int(11)", 'departmentId' => "int(11)", 'username' => Schema::TYPE_STRING . ' NOT NULL', 'password' => Schema::TYPE_STRING . ' NOT NULL', 'authKey' => Schema::TYPE_STRING, 'accessToken' => Schema::TYPE_STRING]); $this->createTable('user_department_assignment', ['userId' => "int(11)", 'departmentId' => "int(11)"]); $this->addPrimaryKey('pk_user_department_assignment', 'user_department_assignment', ['userId', 'departmentId']); $this->addForeignKey('fk_user_profile', 'user', 'profileId', 'user_profile', 'id'); $this->addForeignKey('fk_user_department', 'user', 'departmentId', 'department', 'id'); $this->addForeignKey('fk_department_assignment_user', 'user_department_assignment', 'userId', 'user', 'id'); $this->addForeignKey('fk_department_assignment_department', 'user_department_assignment', 'departmentId', 'department', 'id'); $data = []; for ($i = 0; $i < 100; $i++) { $data[] = ['name' => 'Department No.' . $i]; } DbHelper::insertMultiple('department', $data); $this->insert('user_profile', ['id' => 1, 'email' => '*****@*****.**', 'phone' => '0123456789']); $this->insert('user_profile', ['id' => 2, 'email' => '*****@*****.**', 'phone' => '9876543210']); $data = []; for ($i = 0; $i < 1000; $i++) { $data[] = ['email' => "user_{$i}@fproject.net", 'phone' => '0123456789']; } DbHelper::insertMultiple('user_profile', $data); $this->insert('user', ['profileId' => 1, 'username' => 'admin', 'password' => 'admin', 'authKey' => 'test100key', 'accessToken' => '100-token']); $this->insert('user', ['profileId' => 2, 'username' => 'demo', 'password' => 'demo', 'authKey' => 'test101key', 'accessToken' => '101-token']); $data = []; for ($i = 0; $i < 500; $i++) { $data[] = ['profileId' => $i + 3, 'departmentId' => 1 + $i % 100, 'username' => 'demo_no_' . $i, 'password' => 'demo_no_' . $i, 'authKey' => "test_{$i} _key", 'accessToken' => 'test_$i _token']; } DbHelper::insertMultiple('user', $data); }
/** * Delete a list of models according to the primary key values. * @return int the number of deleted models */ public function run() { $ids = Yii::$app->getRequest()->getBodyParams(); /* @var $modelCls ActiveRecord */ $modelCls = new $this->modelClass(); if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $modelCls); } $pks = $modelCls::primaryKey(); $cnt = count($pks); if ($cnt > 1 || $cnt == 0) { return DbHelper::batchDelete($modelCls::tableName(), $ids); } else { $condition = []; $condition[$pks[0]] = $ids; return $modelCls::deleteAll($condition); } }
/** * Saves or updates a model according to the primary key values. * @return \yii\db\ActiveRecordInterface the model being updated * @throws ServerErrorHttpException * @throws \yii\base\InvalidConfigException */ public function run() { $modelArr = Yii::$app->getRequest()->getBodyParams(); $models = []; foreach ($modelArr as $m) { /* @var $model ActiveRecord */ $model = new $this->modelClass(['scenario' => $this->scenario]); if (!$this->loadModel($model, $m)) { throw new ServerErrorHttpException('Failed to batch-save the models: invalid data'); } if (array_key_exists("_isInserting", $m) && $model->hasProperty("_isInserting")) { $model->{"_isInserting"} = $m["_isInserting"]; } $models[] = $model; } if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $models); } $attributes = $this->getSavingFieldsFromRequest(); if (is_null($attributes)) { $attributes = []; } return DbHelper::batchSave($models, $attributes); }
public function testBatchSaveForUpdatableKeyModel() { /** @var User[] $inputModels */ $inputModels = []; for ($i = 0; $i < 4; $i++) { $m = $inputModels[] = new User(); $m->username = "******" . rand(10000, 99999); $m->password = $m->username; } /** @var User[] $savedReturn */ $savedReturn = []; DbHelper::batchSave($inputModels, [], DbHelper::SAVE_MODE_AUTO, $savedReturn); /** @var User[] $savedUsers */ $savedUsers = $savedReturn['inserted']; $department = new Department(); $department->name = "Department testBatchSaveForUpdatableKeyModel"; $department1 = new Department(); $department1->name = "Department testBatchSaveForUpdatableKeyModel"; $departmentSavedReturn = []; DbHelper::batchSave([$department, $department1], [], DbHelper::SAVE_MODE_AUTO, $departmentSavedReturn); /** @var Department $department */ $department = $departmentSavedReturn['inserted'][0]; /** @var Department $department1 */ $department1 = $departmentSavedReturn['inserted'][1]; /** @var UserDepartmentAssignment[] $inputModels */ $inputModels = []; $ids = []; $sql = ''; for ($i = 0; $i < 3; $i++) { $savedUser = $savedUsers[$i]; $m = $inputModels[] = new UserDepartmentAssignment(); $m->userId = $savedUser->id; $m->departmentId = $department->id; $ids[] = ['userId' => $savedUser->id, 'departmentId' => $department->id]; if ($sql != '') { $sql = $sql . ' OR '; } $sql = $sql . "(`userId`={$savedUser->id} AND `departmentId`={$department->id})"; } DbHelper::batchSave($inputModels); $sql = 'SELECT * FROM ' . UserDepartmentAssignment::tableName() . ' WHERE ' . $sql; /** @var UserDepartmentAssignment[] $savedAssignments */ $savedAssignments = UserDepartmentAssignment::findBySql($sql)->all(); $this->assertEquals(3, count($savedAssignments)); $savedAssignments[0]->departmentId = $department1->id; $savedAssignments[1]->departmentId = $department1->id; $savedAssignments[2]->departmentId = $department1->id; $savedAssignments[2]->userId = $savedUsers[3]->id; DbHelper::batchSave($savedAssignments); $sql1 = ''; foreach ($savedAssignments as $savedAssignment) { if ($sql1 != '') { $sql1 = $sql1 . ' OR '; } $sql1 = $sql1 . "(`userId`={$savedAssignment->userId} AND `departmentId`={$savedAssignment->departmentId})"; } $sql1 = 'SELECT * FROM ' . UserDepartmentAssignment::tableName() . ' WHERE ' . $sql1; $return = UserDepartmentAssignment::findBySql($sql1)->count(); $this->assertEquals(3, $return); $return = UserDepartmentAssignment::findBySql($sql)->count(); $this->assertEquals(0, $return); }