Реляционный атрибут в форме Yii2

Я пытаюсь выяснить правильный способ обработки формы, получающей реляционные данные в Yii2. Я не смог найти хороших примеров этого. У меня есть 2 модели Sets и SetsIntensity, каждый набор может иметь связанную с ним SetsIntensity. Я пытаюсь сделать форму, где вы можете вводить оба одновременно. Я не уверен, как обрабатывать ввод данных для определенной "интенсивности" поля в SetsIntensity.

Где

$model = new \app\models\Sets();

Если я поместил его в поле, как это, проверка клиента не будет работать, а имя атрибута будет неоднозначным, и сохранение будет затруднено

<!--?= $form--->field($model, 'lift_id_fk') ?>
<!--?= $form--->field($model, 'reps') ?>
<!--?= $form--->field($model, 'sets') ?>
<!--?= $form--->field($model, 'type') ?>
<!--?= $form--->field($model, 'setsintensity') ?>

Я хотел бы сделать что-то вроде этого, но я получаю сообщение об ошибке, если я делаю

<!--?= $form--->field($model, 'setsintensity.intensity') ?>
Exception (Unknown Property) 'yii\base\UnknownPropertyException' with message 'Getting unknown property: app\models\Sets::setsintensity.intensity'

Я мог бы сделать еще один объект в контроллере $setsintensity = new Setsintensity();, но я считаю, что это громоздкое решение и, вероятно, не очень хорошая практика, особенно для обработки нескольких отношений

<!--?= $form--->field($setsintensity, 'intensity') ?>

соответствующий код из SetsModel

class Sets extends \yii\db\ActiveRecord
{
 public function scenarios() {
 $scenarios = parent::scenarios();
 $scenarios['program'] = ['lift_id_fk', 'reps', 'sets', 'type', 'intensity'];
 return $scenarios;
 }
public function rules()
{
 return [
 [['lift_id_fk'], 'required'],
 [['lift_id_fk', 'reps', 'sets','setsintensity'], 'integer'],
 [['type'], 'string', 'max' => 1],
 ['intensity', 'safe', 'on'=>'program']
 ];
}
public function getSetsintensity()
{
 return $this->hasOne(Setsintensity::className(), ['sets_id_fk' => 'sets_id_pk']);
}

Модель SetsIntensity

class Setsintensity extends \yii\db\ActiveRecord
{
 public static function tableName()
 {
 return 'setsintensity';
 }
 public function rules()
 {
 return [
 [['sets_id_fk', 'intensity', 'ref_set'], 'required'],
 [['sets_id_fk', 'intensity', 'ref_set'], 'integer']
 ];
 }
 public function getSetsIdFk()
 {
 return $this->hasOne(Sets::className(), ['sets_id_pk' => 'sets_id_fk']);
 }
}

Я также думал, может быть, я мог бы установить отношение hasOne() для конкретного атрибута 'интенсивность' в 'Sets'

1 ответ

Вы должны просто попробовать следующее:

<!--?= $form--->field($model->setsintensity, 'intensity') ?>

ИЗМЕНИТЬ. И поскольку "каждый набор может иметь одну SetsIntensity", вы должны проверить это отношение перед отображением формы, например.

if ($model->setsintensity===null)
{
 $setsintensity = new SetsIntensity;
 $model->link('setsintensity', setsintensity);
}

PS: link метод требует, чтобы значение первичного ключа не было нулевым.

licensed under cc by-sa 3.0 with attribution.