jlorente / yii2-activerecord-inheritance

ActiveRecord Inheritance is an util to provide the Class Table Inheritance Pattern the to the Yii2 framework
MIT License
18 stars 7 forks source link

Not compatible with yii2 2.0.45 #13

Open goraxan opened 2 years ago

goraxan commented 2 years ago

When trying to access a parent property for a newly created ActiveRecord, the whole server crashes without any error. It's working fine with the 2.0.44 version. I've tried with php 7.4 and 8.0, same results.

This access https://github.com/jlorente/yii2-activerecord-inheritance/blob/master/src/ActiveRecordInheritanceTrait.php#L95 causes the cash. While in the 2.0.44 version it returns null (because the entry is not saved yet) in 2.0.45 it crashes.

Changing the function to this might work:

if ($this->getIsNewRecord() === true) {
    $this->_parent = new $pClass();
} else {
    $parent = $this->_parent()->one();
    if($parent !== null)
        $this->_parent = $parent;
}

To reproduce:

$admin = new Admin();
$admin->username = 'al-acran'; <-- crash without any error

This works fine;

$admin = Admin::find()->one();
$admin->username = 'al-acran';

Any thoughts on this?

skotos commented 2 years ago

There appears to be an infinite recursive loop causing a segmentation fault. From vdebug:

[0] common\models\Child->getParent @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:94
[1] common\models\Child->__isset @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:176
[2] common\models\Child->offsetExists @ /home/example/example/vendor/yiisoft/yii2/db/BaseActiveRecord.php:1225
[3] yii\db\ActiveQuery->filterByModels @ /home/example/example/vendor/yiisoft/yii2/db/ActiveRelationTrait.php:531
[4] yii\db\ActiveQuery->prepare @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:196
[5] yii\db\mysql\QueryBuilder->build @ /home/example/example/vendor/yiisoft/yii2/db/QueryBuilder.php:227
[6] yii\db\ActiveQuery->createCommand @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:328
[7] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/Query.php:287
[8] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:304
[9] common\models\Child->getParent @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:95
[10] common\models\Child->__isset @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:176
[11] common\models\Child->offsetExists @ /home/example/example/vendor/yiisoft/yii2/db/BaseActiveRecord.php:1225
[12] yii\db\ActiveQuery->filterByModels @ /home/example/example/vendor/yiisoft/yii2/db/ActiveRelationTrait.php:531
[13] yii\db\ActiveQuery->prepare @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:196
[14] yii\db\mysql\QueryBuilder->build @ /home/example/example/vendor/yiisoft/yii2/db/QueryBuilder.php:227
[15] yii\db\ActiveQuery->createCommand @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:328
[16] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/Query.php:287
[17] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:304
[18] common\models\Child->getParent @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:95
[19] common\models\Child->__isset @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:176
[20] common\models\Child->offsetExists @ /home/example/example/vendor/yiisoft/yii2/db/BaseActiveRecord.php:1225
[21] yii\db\ActiveQuery->filterByModels @ /home/example/example/vendor/yiisoft/yii2/db/ActiveRelationTrait.php:531
[22] yii\db\ActiveQuery->prepare @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:196
[23] yii\db\mysql\QueryBuilder->build @ /home/example/example/vendor/yiisoft/yii2/db/QueryBuilder.php:227
[24] yii\db\ActiveQuery->createCommand @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:328
[25] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/Query.php:287
[26] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:304
[27] common\models\Child->getParent @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:95
[28] common\models\Child->__isset @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:176
[29] common\models\Child->offsetExists @ /home/example/example/vendor/yiisoft/yii2/db/BaseActiveRecord.php:1225
[30] yii\db\ActiveQuery->filterByModels @ /home/example/example/vendor/yiisoft/yii2/db/ActiveRelationTrait.php:531
[31] yii\db\ActiveQuery->prepare @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:196
[32] yii\db\mysql\QueryBuilder->build @ /home/example/example/vendor/yiisoft/yii2/db/QueryBuilder.php:227
[33] yii\db\ActiveQuery->createCommand @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:328
[34] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/Query.php:287
[35] yii\db\ActiveQuery->one @ /home/example/example/vendor/yiisoft/yii2/db/ActiveQuery.php:304
[36] common\models\Child->getParent @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:95
[37] common\models\Child->__set @ /home/example/example/vendor/jlorente/yii2-activerecord-inheritance/src/ActiveRecordInheritanceTrait.php:148
[38] console\controllers\TestController->actionDoInheritance @ /home/example/example/console/controllers/TestController.php:64
[39] call_user_func_array:{/home/example/example/vendor/yiisoft/yii2/base/InlineAction.php:57} @ /home/example/example/vendor/yiisoft/yii2/base/InlineAction.php:57
[40] yii\base\InlineAction->runWithParams @ /home/example/example/vendor/yiisoft/yii2/base/InlineAction.php:57
[41] console\controllers\TestController->runAction @ /home/example/example/vendor/yiisoft/yii2/base/Controller.php:178
[42] console\controllers\TestController->runAction @ /home/example/example/vendor/yiisoft/yii2/console/Controller.php:182
[43] yii\console\Application->runAction @ /home/example/example/vendor/yiisoft/yii2/base/Module.php:552
[44] yii\console\Application->runAction @ /home/example/example/vendor/yiisoft/yii2/console/Application.php:180
[45] yii\console\Application->handleRequest @ /home/example/example/vendor/yiisoft/yii2/console/Application.php:147
[46] yii\console\Application->run @ /home/example/example/vendor/yiisoft/yii2/base/Application.php:384
[47] {main} @ /home/example/example/yii:35