Hello. I can’t understand next behavior which happens when I use ActiveRecords in RestController. I get this behavior in the next steps:
- POST /create
In actionCreate() I have something like next code:
$data = Yii::$app->getRequest()->getBodyParams();
// get other data from request ...
// check requested data ....
$model = new Bet();
$model->load($data, '');
$model->initializer_user_id = $this->currentUser->getId();
$model->create_datetime = date("Y-m-d H:i:s", time());
// set other fields of the model
$model->save();
Then I saw next queries in the MySQL query log:
140724 14:56:05 1458 Connect root@localhost on db
1458 Query SET NAMES 'utf8'
1458 Query SELECT * FROM `user` WHERE `facebook_access_token`='2'
1458 Query SHOW FULL COLUMNS FROM `user`
1458 Query SHOW CREATE TABLE `user`
1458 Query SHOW FULL COLUMNS FROM `bet`
1458 Query SHOW CREATE TABLE `bet`
1458 Query SELECT * FROM `bet`
.................................................................................................
1458 Query SELECT * FROM `event` WHERE `id`='1'
1458 Query SHOW FULL COLUMNS FROM `event`
1458 Query SHOW CREATE TABLE `event`
1458 Query SELECT 1 FROM `user` WHERE `id`='3'
1458 Query SELECT 1 FROM `user` WHERE `id`='2'
1458 Query SELECT 1 FROM `event` WHERE `id`='1'
1458 Query INSERT INTO `bet` (`event_id`, `opponent_user_id`, `initializer_user_id`, `create_datetime`, `opponent_status`, `winner`) VALUES ('1', '3', '2', '2014-07-24 09:56:05', 'pending', 'pending')
1458 Query SELECT * FROM `bet`
1458 Quit
All OK.
- I sent request: POST /delete/<id>
I write something like next code in the actionDelete($id) :
$bet = Bet::find()
->where([
'id'=>$id,
'initializer_user_id' => $this->currentUser->getId()
])->one();
// check data
$bet->delete()
Then I saw next queries in the MySQL query log:
140724 14:56:48 1459 Connect root@localhost on db
1459 Query SET NAMES 'utf8'
1459 Query SELECT * FROM `user` WHERE `facebook_access_token`='2'
1460 Connect root@localhost on betmedb
1460 Query SET NAMES 'utf8'
1460 Query SELECT * FROM `user` WHERE `facebook_access_token`='2'
1459 Query SHOW FULL COLUMNS FROM `user`
1460 Query SHOW FULL COLUMNS FROM `user`
1459 Query SHOW CREATE TABLE `user`
1460 Query SHOW CREATE TABLE `user`
1460 Query SELECT * FROM `bet` WHERE (`id`='129') AND (`winner`='pending') AND (`initializer_user_id`='2')
1460 Query SHOW FULL COLUMNS FROM `bet`
1459 Query SELECT * FROM `bet` WHERE (`id`='129') AND (`winner`='pending') AND (`initializer_user_id`='2')
1459 Query SHOW FULL COLUMNS FROM `bet`
1460 Query SHOW CREATE TABLE `bet`
1459 Query SHOW CREATE TABLE `bet`
1459 Query DELETE FROM `bet` WHERE (`id`='129') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1460 Query DELETE FROM `bet` WHERE (`id`='129') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1460 Quit
1459 Quit
As you can see, we get copy of all queries.
I think that this is wrong, but i can’t understand why Yii2 generates copy of all queries.
- I sent request: POST /create again.
Then I got next log:
140724 14:56:57 1461 Connect root@localhost on betmedb
1461 Query SET NAMES 'utf8'
1461 Query SELECT * FROM `user` WHERE `facebook_access_token`='2'
1462 Connect root@localhost on betmedb
1462 Query SET NAMES 'utf8'
1462 Query SELECT * FROM `user` WHERE `facebook_access_token`='2'
1461 Query SHOW FULL COLUMNS FROM `user`
1462 Query SHOW FULL COLUMNS FROM `user`
1461 Query SHOW CREATE TABLE `user`
1462 Query SHOW CREATE TABLE `user`
1461 Query SHOW FULL COLUMNS FROM `bet`
1462 Query SHOW FULL COLUMNS FROM `bet`
1461 Query SHOW CREATE TABLE `bet`
1462 Query SHOW CREATE TABLE `bet`
1462 Query SELECT * FROM `bet`
140724 14:56:58 1461 Query SELECT * FROM `bet`
1462 Query SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1461 Query SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1461 Query SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1462 Query SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1461 Query SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1462 Query SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')
1461 Query SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3')
1462 Query SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3')
1461 Query SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='3') AND (`opponent_user_id`='2')
1462 Query SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='3') AND (`opponent_user_id`='2')
1462 Query SELECT * FROM `event` WHERE `id`='1'
1461 Query SELECT * FROM `event` WHERE `id`='1'
1461 Query SHOW FULL COLUMNS FROM `event`
1461 Query SHOW CREATE TABLE `event`
1462 Query SHOW FULL COLUMNS FROM `event`
1461 Query SELECT 1 FROM `user` WHERE `id`='3'
1462 Query SHOW CREATE TABLE `event`
1461 Query SELECT 1 FROM `user` WHERE `id`='2'
1462 Query SELECT 1 FROM `user` WHERE `id`='3'
1461 Query SELECT 1 FROM `event` WHERE `id`='1'
1462 Query SELECT 1 FROM `user` WHERE `id`='2'
1461 Query INSERT INTO `bet` (`event_id`, `opponent_user_id`, `initializer_user_id`, `create_datetime`, `opponent_status`, `winner`) VALUES ('1', '3', '2', '2014-07-24 09:56:57', 'pending', 'pending')
1462 Query SELECT 1 FROM `event` WHERE `id`='1'
1462 Query INSERT INTO `bet` (`event_id`, `opponent_user_id`, `initializer_user_id`, `create_datetime`, `opponent_status`, `winner`) VALUES ('1', '3', '2', '2014-07-24 09:56:57', 'pending', 'pending')
1461 Query SELECT * FROM `bet`
1462 Query SELECT * FROM `bet`
1462 Quit
1461 Quit
We can see that Yii make copy of all queries again. Also, validation don’t apply and I get two identical rows(this is wrong, because I wrote validators for check this case).