Метод извлечения PDO передает неверный параметр классу конструктора (в Yii) - PullRequest
0 голосов
/ 30 апреля 2020

Класс модели MyModel имеет следующее поведение

public function behaviors() {
        return [
            'CTimestampBehavior' => [
                'class' => 'zii.behaviors.CTimestampBehavior',
                'createAttribute' => null,
                'updateAttribute' => 'update_time',
                'setUpdateOnCreate' => true
            ]
        ];
    }

В коде в контроллере я пишу что-то вроде

$model = new MyModel();
$dataReader = Yii::app()->db->createCommand()
    ->selectDistinct('some fields')
    ->from('MyModel')
    ->leftJoin('some table')
    ->where('some criteria')
    ->query();
while ($item = $dataReader->readObject('MyMode', $model->getAttributes())) {
    **//!!! HERE item array is with model attributes, which are empty**
    $items[] = $item;
}

катастрофа, она не работает, элементы - это массив, каждый из элементов содержит пустой список атрибутов, например, никаких данных, извлеченных из db

Если я напишу

$dataReader = Yii::app()->db->createCommand()
    ->selectDistinct('some fields')
    ->from('MyModel')
    ->leftJoin('some table')
    ->where('some criteria')
    ->query();
while ($item = $dataReader->readObject('MyModel', MyModel::model()->getAttributes())) {


//!!! HERE item array is with model attributes, which hold correct data, taken from db
    $items[] = $item;
}

, это работает

Если я избавлюсь от поведения CTimestamp, оба случая будут работать.

Если я отлаживаю первый случай, я понимаю, что после завершения pdo fetchobject он вызывает конструктор с script = "current_timestamp ()". Вопрос почему? И где я ошибся?

1 Ответ

1 голос
/ 30 апреля 2020

Если вы прочитаете документацию readObject(), вы обнаружите, что вторым аргументом является не список полей, а список аргументов конструктора. CActiveRecord имеет только один аргумент конструктора - $scenario. $dataReader->readObject('MyMode', $model->getAttributes()) по существу назначает случайное значение в качестве сценария, поскольку оно получит первое значение из $model->getAttributes(). В вашем случае вам, вероятно, понадобится:

$item = $dataReader->readObject('MyModel', []);
...