Я использую Yii2, и у меня есть виртуальный атрибут notes2
(который используется функциями графического интерфейса вместо примечаний к атрибуту базы данных):
class Order extends \yii\db\ActiveRecord
{
public function getnotes2() {
return iconv('UTF-16LE', 'UTF-8', $this->notes);
}
public function setnotes2($value) {
$this->notes = iconv('UTF-8', 'UTF-16LE', $value);
}
}
В этом случае оба следующих кода $order->notes2
и $order->Notes2
вызывают установщик и возвращают правильное значение.
Но я должен использовать функцию $order->getAttributes()
, и реализация по умолчанию не включает виртуальные атрибуты. Поэтому я попытался переопределить эту функцию с помощью:
public function attributes() {
$attributes = parent::attributes();
$attributes['notes2'] = 'notes2';
return $attributes;
}
А теперь json_encode($order->getAttributes())
включает пустое поле notes2
, но $order->notes2
(очевидно - это приводит к тому, что поле notes2
становится пустым) не имеет значения, но $order->Notes2
имеет значение!
Почему происходит такой триггер регистра первого символа? Как правильно объявить виртуальное поле, которое доступно и в getAttributes()
?
Но следующий код (вместо переопределения attributes()
)
public function getAttributes($names = null, $except = []) {
return array_merge(['notes2'], parent::getAttributes($names, $except));
}
ведет себя так, как будто ничего не было переопределено - и $order->notes2
, и $order->Notes2
рассчитываются, и в json_encode($order->getAttributes())
нет
notes2
(или
Notes2
)