具有关系 属性 的 Yii2 保存模型

Yii2 saving model with relationship property

我正在尝试从表单中保存模型,该模型具有通过联结 table 定义的关系,但由于 属性 是关系对象,因此它是只读的并且验证失败。

模型关系:

public $payer
/**
 * @return \yii\db\ActiveQuery
 */
public function getPayerRelationship()
{
    return $this->hasMany(PartyRelationship::className(), ['contract_id' => 'id'])->where(['relationship' => 'P']);
}

public function getPayers(){
    return $this->hasMany(ContractingParty::className(), ['id' => 'contracting_party_id'])
        ->via('payerRelationship');
}
public function getContractors() {  // could be a static func as well
    $model = ContractingParty::find()->asArray()->all();
    return ArrayHelper::map($model, 'id', 'subject_name');
}

表单视图:

<?= $form->field($model, 'payers')->widget(Select2::classname(), [
    'data' => $model->getContractors(),
    'language' => 'en',
    'options' => ['placeholder' => '-- Select company --'],
    'pluginOptions' => [
        'allowClear' => true,
        'multiple' => true,
    ],
    'showToggleAll' => false

]) ?>

它不会验证或保存,因为只读 属性 付款人。我尝试在 $form->field($model, 'payer'... (而不是付款人)中使用不同的 属性,然后验证工作甚至保存工作,但问题是,编辑没有该模型的预选值,因为它们在模型->付款人中。我不知道,我应该在这里传递什么而不是这个关系对象(或一般模型的 属性)。

可能我真的瞎了,但是在手册中有很多关于从数据库获取数据的信息,但几乎没有关于保存的信息。 (顺便说一句。我看到了这个 post: - 但那根本没有给我任何新信息)。

是我的表单设计有误,还是模型设计有误(意思是我应该只使用两个模型创建表单域)?谢谢

向模型添加二传手:

public function setPayer(){
    $payer_id_array = array();
    $payer_array = ArrayHelper::toArray($this->payers);
    foreach ($payer_array as $value){
        $payer_id_array [] = $value['id'];
    }
    $this->payer = $payer_id_array;
}

public function setRecipient(){
    $recipient_id_array = array();
    $recipient_array = ArrayHelper::toArray($this->recipients);
    foreach ($recipient_array as $value){
        $recipient_id_array [] = $value['id'];
    }
    $this->recipient = $recipient_id_array;
}

并手动进入控制器(操作创建和更新):

$model->setPayer();
$model->setRecipient();

似乎解决了传递到字段中的关系名称与 属性 之间的冲突。