/**
* @var int $id
* @var string $a
* @var string $b
*/
class MyClass extends ActiveRecord
{
public function getParam()
{
return $this->a . $this->b;
}
public function getSubClass()
{
return $this->hasOne(SubClass::class, ['parent_id' => 'id']);
}
}
/**
* @var int $id
* @var int $parent_id
* @var string $c
* @var string $d
*/
class SubClass extends ActiveRecord {}
Yii::$app->response->format = Response::FORMAT_JSON;
$models = MyClass::find()->where(...)->all();
return [
'models' => $models,
];
[
'a' => MyClass::a,
'param' => MyClass::param,
'child' => [
'c' => SubClass::c,
],
]
class MyActiveRecord extends \yii\db\ActiveRecord
{
public static $usedExtraFields = [];
public static function getExtraFields(): array
{
return [];
}
public static function useExtraFields(?array $keys = null): void
{
if (($keys[0] ?? null) === '*') $keys = null;
static::$usedExtraFields[static::class] = $keys;
}
public function fields(): array
{
$extraFields = static::getExtraFields();
if ((static::$usedExtraFields[static::class] ?? null) !== null) {
$extraFields = ArrayHelper::filter($extraFields, static::$usedExtraFields[static::class]);
}
return array_merge(parent::fields(), $extraFields);
}
}
// классы наследуются от MyActiveRecord и перегружают getExtraFields()
class MyClass extends MyActiveRecord
{
public static function getExtraFields(): array
{
return [
'param' => 'param',
'child' => static function ($model) {
return $model->getSubClass()->select('c')->one();
},
];
}
}
// используется это так:
Yii::$app->response->format = Response::FORMAT_JSON;
MyClass::useExtraFields([]); // запретить дополнительные поля
MyClass::useExtraFields(['param']); // ограничить дополнительные поля
MyClass::useExtraFields(['child']); // ограничить дополнительные поля
MyClass::useExtraFields(); // разрешить все дополнительные поля
$models = MyClass::find()->where(...)->all();
return [
'models' => $models,
];