Yii2 属性标签()
Yii2 attributeLabels()
我有一个 ActiveRecord 模型,它具有用于属性标签的此功能:
public function attributeLabels() {
return [
'start_date' => Text::getText('model_group_StartDate'),
// and many more texts ....
];
}
现在我的问题是,当我使用 ActiveForm 并让 Yii 自动加载标签时,它会产生太多 sql 查询,因为每次它加载标签时都会调用 attributeLabels()
并减慢我的页面速度.
我必须从数据库中加载属性标签。
我知道我可以通过 label()
在 ActiveForm 中设置自己的标签,但我更喜欢在我的模型中使用它,因为我必须在不同的地方使用标签。
对于如何仅加载一次属性标签的任何提示,我都很高兴。
Yii 确实会在每次请求单个属性标签时调用您的函数 attributeLabels()
(并因此执行 Text::getText()
)。
您可以通过在 class 级别缓存生成的属性标签来解决此问题,这意味着只需为 { 的每个组合生成一次标签class,每个请求的属性}。如果你有一个公共的 class,你的所有 ActiveRecord classes 都从中扩展,你可以用这样的代码一劳永逸地解决它:
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];
}
}
我有一个 ActiveRecord 模型,它具有用于属性标签的此功能:
public function attributeLabels() {
return [
'start_date' => Text::getText('model_group_StartDate'),
// and many more texts ....
];
}
现在我的问题是,当我使用 ActiveForm 并让 Yii 自动加载标签时,它会产生太多 sql 查询,因为每次它加载标签时都会调用 attributeLabels()
并减慢我的页面速度.
我必须从数据库中加载属性标签。
我知道我可以通过 label()
在 ActiveForm 中设置自己的标签,但我更喜欢在我的模型中使用它,因为我必须在不同的地方使用标签。
对于如何仅加载一次属性标签的任何提示,我都很高兴。
Yii 确实会在每次请求单个属性标签时调用您的函数 attributeLabels()
(并因此执行 Text::getText()
)。
您可以通过在 class 级别缓存生成的属性标签来解决此问题,这意味着只需为 { 的每个组合生成一次标签class,每个请求的属性}。如果你有一个公共的 class,你的所有 ActiveRecord classes 都从中扩展,你可以用这样的代码一劳永逸地解决它:
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];
}
}