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

Я пытаюсь найти правильный способ обработки формы, получающей реляционные данные в Yii2. Я не смог найти хороших примеров этого. У меня есть 2 модели Sets и SetsIntensity, каждый Set может иметь одну 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() отношение для конкретного атрибута «интенсивность» в «Наборы»

4

Решение

Вы должны просто попробовать это:

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

РЕДАКТИРОВАТЬ : А потому что «каждый сет может есть одна SetsIntensity «, вы должны проверить это отношение перед отображением формы, например:

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]