2017-01-30 84 views
1

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

型号的关系:

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'...(而不是付款人),然后验证工作甚至保存工作,但麻烦在于,该编辑没有该模型的预选值,因为他们是在模型 - >付款人,我不知道,我应该通过这里,而不是这个关系对象(或一般模型的属性)

也许iam明显失明,但在手册中有一个。很多有关从数据库中获取数据,但几乎没有关于拯救的信息 (顺便说一句,我看到这个帖子:Yii2 Invalid Call: Setting read-only property - 但没有给我任何新资料片的话)。

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

+0

在您的代码中,“付款人”是一种定义的关系,而不是属性或数据库行。如果一个模型正确地使用了值,你可以简化$ model-> save()。它是有据可查的[ActiveRecord](http://www.yiiframework.com/doc-2.0/guide-db-active-record.html) – R13e

回答

0

添加制定者模式:

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(); 

似乎解决关系和财产的传入领域名称之间的冲突。

+0

这就是解决方案。我只是觉得奇怪的是直接在形式上使用关系,但它的作用像魅力,所以为什么不呢? (无论如何,它不应该像这样使用它)。 – Nimer

相关问题