Yii2 形式的关系属性

Ric*_*Ric 5 php forms activerecord relational yii2

我试图找出在 Yii2 中处理接收关系数据的表单的正确方法。我还没有找到任何好的例子。我有 2 个模型 Sets 和 SetsIntensity,每个 Set 可能有一个与其关联的 SetsIntensity。我正在尝试制作一个可以同时输入两者的表格。我不确定如何处理获取 SetsIntensity 中特定字段“强度”的输入。

在哪里

$model = new \app\models\Sets();
Run Code Online (Sandbox Code Playgroud)

如果我把它放在像这样的字段中,客户端验证将不起作用,并且属性名称不明确并且保存变得困难

<?= $form->field($model, 'lift_id_fk') ?>
<?= $form->field($model, 'reps') ?>
<?= $form->field($model, 'sets') ?>
<?= $form->field($model, 'type') ?>
<?= $form->field($model, 'setsintensity') ?>
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情,但如果这样做我会收到错误

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

我可以在控制器中创建另一个对象$setsintensity = new Setsintensity();,但我觉得这是一个麻烦的解决方案,并且可能不是一个好的实践,特别是对于处理多个关系

<?= $form->field($setsintensity, 'intensity') ?>
Run Code Online (Sandbox Code Playgroud)

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']);
}
Run Code Online (Sandbox Code Playgroud)

集合强度模型

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']);
    }
}
Run Code Online (Sandbox Code Playgroud)

hasOne()我也在想也许我可以为“集合”中的特定属性“强度”建立一个关系

soj*_*oju 5

你应该简单地尝试这个:

<?= $form->field($model->setsintensity, 'intensity') ?>
Run Code Online (Sandbox Code Playgroud)

编辑:因为“每个集合可能有一个集合强度”,所以您应该在显示表单之前检查此关系,例如:

if ($model->setsintensity===null)
{
    $setsintensity = new SetsIntensity;
    $model->link('setsintensity', setsintensity);
}
Run Code Online (Sandbox Code Playgroud)

PS:link方法要求主键值不为空。