PDO的fetch方法将错误的参数传递给构造函数类(在Yii中)

8fq7wneg  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(129)

模型类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;
}

灾难,它不工作,items是数组,每个元素都包含空属性列表,就像没有从数据库中提取数据一样
如果我写

$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完成后,它会用scenario=“current_timestamp()"调用构造函数。问题是为什么?我错过了什么?

biswetbf

biswetbf1#

如果您阅读readObject()文档,您会发现第二个参数不是字段列表,而是构造函数参数列表。CActiveRecord只有一个构造函数参数-$scenario$dataReader->readObject('MyMode', $model->getAttributes())实际上将随机值指定为scenario,因为它将从$model->getAttributes()获取第一个值。在您的情况下,您可能需要:

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

相关问题