我想将新列slug
添加到现有表中。这是我的迁移代码:
$this->addColumn('region', 'slug', $this->string()->unique());
我也想避免在现有记录中使用NULL
。为此,我创建了行为:
public function behaviors()
{
return [
...
[
'class' => SluggableBehavior::className(),
'attribute' => 'title_ru',
'slugAttribute' => 'slug',
'ensureUnique' => true,
'immutable' => true,
'skipOnEmpty' => false,
],
...
];
}
和规则:
public function rules()
{
return [
...
[['slug'], 'string', 'max' => 256],
[['slug'], 'unique'],
...
];
}
所以我认为,如果我调用save()
方法,则slug
将自动在现有记录中生成。这是我在同一迁移中的简单代码:
$regions = Region::find()->all();
foreach ($regions as $region) {
$region->save();
}
但是它不能按预期工作:
+----+------------------------+------------------------+------+
| id | title_ru | title_uk | slug |
+----+------------------------+------------------------+------+
| 1 | Интернет | Інтернет | |
| 2 | Интернет+ТВ | Інтернет+ТБ | -2 |
| 3 | Корпоративным клиентам | Корпоративним кліентам | -3 |
+----+------------------------+------------------------+------+
我做错了什么?感谢您的任何建议。
更奇怪的是,在CRUD管理员中一切正常。
更新#1
试图使用validate()
方法,但仍然没有结果。
$regions = Region::find()->all();
foreach ($regions as $region) {
if ($region->validate()) {
$region->save();
}
}
答案 0 :(得分:0)
看起来一切都对行为有好处。问题出在西里尔字母和php配置上。