具有关系 属性 的 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();
似乎解决了传递到字段中的关系名称与 属性 之间的冲突。
我正在尝试从表单中保存模型,该模型具有通过联结 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();
似乎解决了传递到字段中的关系名称与 属性 之间的冲突。