2017-01-30 66 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

相關問題