我有一个带有此功能的ActiveRecord模型用于属性标签:
public function attributeLabels() {
return [
'start_date' => Text::getText('model_group_StartDate'),
// and many more texts ....
];
}
现在我的问题是,当我使用ActiveForm并让Yii自动加载标签时会产生太多的sql查询,因为每次加载标签时它会调用attributeLabels()
并减慢我的页面。
我必须从数据库加载属性标签。
我知道我可以通过label()
在ActiveForm中设置自己的标签,但我更喜欢在我的模型中使用它,因为我必须在不同的地方使用标签。
我很高兴任何提示如何只加载一次属性标签。
答案 0 :(得分:3)
每次请求单个属性标签时,Yii确实会调用您的函数attributeLabels()
(因此执行Text::getText()
)。
您可以通过在类级别缓存生成的属性标签来解决此问题,这意味着每个请求的{class,attribute}的每个组合只需要生成一次标签。如果您有一个所有ActiveRecord类扩展的公共类,您可以使用以下代码一劳永逸地解决它:
class ActiveRecord extends \yii\db\ActiveRecord {
private static $getAttributeLabelCache;
public function getAttributeLabel($attribute)
{
$class = get_class($this);
if (!isset(self::$getAttributeLabelCache[$class][$attribute])) {
self::$getAttributeLabelCache[$class][$attribute] = parent::getAttributeLabel($attribute);
}
return self::$getAttributeLabelCache[$class][$attribute];
}
}