2014-12-03 3 views
4

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

Где

$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 Model

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']); 
    } 
} 

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

ответ

4

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

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

EDIT: А потому, что «каждый набор может один SetsIntensity», вы должны проверить это соотношение перед отображением формы, например, :

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

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

+0

Тогда я получаю сообщение об ошибке, как этот вызов функции члена FORMNAME() на не-объект – Ric

+0

, потому что «каждый комплект ** ** может иметь один SetsIntensity» – soju

+0

Ну на данный момент ни одно из множеств имеют SetsIntensity еще, я хочу получить это от пользователя – Ric

Смежные вопросы