簡體   English   中英

與Select2具有一對多關系的一種形式的多種模型

[英]Multiple model in one form with one to many relation with Select2

我在數據庫上有這樣的關系:

關系

我的目標是,當我將記錄插入到bukti_penerimaan表中時,我還將很多記錄保存到bukti_penerimaan_invoice表中,還將很多記錄保存在bukti_penerimaan_debit_note表中。

模型

<?php
    class BuktiPenerimaan extends \yii\db\ActiveRecord{

        public function getBuktiPenerimaanDebitNotes(){
            return $this->hasMany(BuktiPenerimaanDebitNote::className(), ['bukti_penerimaan_id' => 'id']);
        }

        public function getBuktiPenerimaanInvoices(){
            return $this->hasMany(BuktiPenerimaanInvoice::className(), ['bukti_penerimaan_id' => 'id']);
        }
    }
?>

這就是actionCreate,可以成功運行。

調節器

public function actionCreate(){
    $request = Yii::$app->request;
    $model = new BuktiPenerimaan(); // one record
    $modelsBuktiPenerimaanInvoice = new BuktiPenerimaanInvoice(); // to many record
    $modelsBuktiPenerimaanDebitNote = new BuktiPenerimaanDebitNote(); // to many record

    if ($request->isAjax) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        if ($request->isGet) { // which is fine
            return [
                'title' => "Create new BuktiPenerimaan",
                'content' => $this->renderAjax('create', [
                    'model' => $model,
                    'modelsBuktiPenerimaanInvoice' => $modelsBuktiPenerimaanInvoice,
                    'modelsBuktiPenerimaanDebitNote' => $modelsBuktiPenerimaanDebitNote
                ]),
                'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
                    Html::button('Save', ['class' => 'btn btn-primary', 'type' => "submit"])

            ];
        } else if ($model->load($request->post())&& $modelsBuktiPenerimaanDebitNote->load($request->post())&& $modelsBuktiPenerimaanInvoice->load($request->post())
                    && Model::validateMultiple([$model, $modelsBuktiPenerimaanDebitNote, $modelsBuktiPenerimaanInvoice])) {

            //doing transaction here. ;

        } else{
            return [
                'title' => "Create new BuktiPenerimaan",
                'content' => $this->renderAjax('create', [
                    'model' => $model,
                    'modelsBuktiPenerimaanInvoice' => $modelsBuktiPenerimaanInvoice,
                    'modelsBuktiPenerimaanDebitNote' => $modelsBuktiPenerimaanDebitNote
                ]),
                'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
                    Html::button('Save', ['class' => 'btn btn-primary', 'type' => "submit"])

            ];
        }
    }
}

查看:create.php

    <?= $this->render('_form', [
        'model' => $model,
        'modelsBuktiPenerimaanInvoice' => $modelsBuktiPenerimaanInvoice,
        'modelsBuktiPenerimaanDebitNote' => $modelsBuktiPenerimaanDebitNote
]) ?>

查看_form.php

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'rekening')->textInput(['readonly' => true, 'maxlength' => true]) ?>

    /*Find standard invoices*/
    <?php $dataInvoice = \yii\helpers\ArrayHelper::map(\app\models\finance\Invoice::find()->all(), 'id', 'nomor_surat'); ?>
    <?= $form->field($modelsBuktiPenerimaanInvoice, 'invoice_id')->widget(Select2::className(), [
        'data' => $dataInvoice,
        'options' => ['multiple' => true, 'placeholder' => 'Select Invoice / Invoices ...']
        ]); ?>

    /*Find standard debit_notes*/
    <?php $dataDebitNote = \yii\helpers\ArrayHelper::map(\app\models\finance\DebitNote::find()->all(), 'id', 'nomor_surat'); ?>
    <?= $form->field($modelsBuktiPenerimaanDebitNote, 'debit_note_id')->widget(Select2::className(), [
        'data' => $dataDebitNote,
        'options' => ['multiple' => true, 'placeholder' => 'Select Debit Note / Debit Notes ...']
    ]); ?>
<?php ActiveForm::end(); ?>

一切順利。

但是在actionUpdate中出現錯誤。

調節器

<?php   
public function actionUpdate($id){
    $request = Yii::$app->request;
    try {
        $model = $this->findModel($id);
    } catch (NotFoundHttpException $e) {
        return $e->getMessage();
    }

    $modelsBuktiPenerimaanInvoice = $model->buktiPenerimaanInvoices;
    $modelsBuktiPenerimaanDebitNote = $model->buktiPenerimaanDebitNotes;

    if ($request->isAjax) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        if ($request->isGet) {
            return [
                'title' => "Update BuktiPenerimaan #" . $id,
                'content' => $this->renderAjax('update', [
                    'model' => $model,
                    'modelsBuktiPenerimaanDebitNote' => $modelsBuktiPenerimaanDebitNote,
                    'modelsBuktiPenerimaanInvoice' => $modelsBuktiPenerimaanInvoice,
                ]),
                'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
                    Html::button('Save', ['class' => 'btn btn-primary', 'type' => "submit"])
            ];
        } else if ($model->load($request->post())
            && $modelsBuktiPenerimaanDebitNote->load($request->post())
            && $modelsBuktiPenerimaanInvoice->load($request->post())
            && Model::validateMultiple([$model, $modelsBuktiPenerimaanDebitNote, $modelsBuktiPenerimaanInvoice])) {
            return [
                'forceReload' => '#crud-datatable-pjax',
                'title' => "BuktiPenerimaan #" . $id,
                'content' => $this->renderAjax('view', [
                    'model' => $model,
                ]),
                'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
                    Html::a('Edit', ['update', 'id' => $id], ['class' => 'btn btn-primary', 'role' => 'modal-remote'])
            ];
        } else {
            return [
                'title' => "Update BuktiPenerimaan #" . $id,
                'content' => $this->renderAjax('update', [
                    'model' => $model,
                    'modelsBuktiPenerimaanDebitNote' => $modelsBuktiPenerimaanDebitNote,
                    'modelsBuktiPenerimaanInvoice' => $modelsBuktiPenerimaanInvoice,
                ]),
                'footer' => Html::button('Close', ['class' => 'btn btn-default pull-left', 'data-dismiss' => "modal"]) .
                    Html::button('Save', ['class' => 'btn btn-primary', 'type' => "submit"])
            ];
        }
    }
}
?>

錯誤是

"name":"PHP Fatal Error","message":"Call to a member function isAttributeRequired() on array","code":1,"type":"yii\\base\\ErrorException"

問題出在:

    <?php $dataInvoice = \yii\helpers\ArrayHelper::map(\app\models\finance\Invoice::find()->all(), 'id', 'nomor_surat'); ?>
<?= $form->field($modelsBuktiPenerimaanInvoice, 'invoice_id')->widget(Select2::className(), [
    'data' => $dataInvoice,
    'options' => ['multiple' => true, 'placeholder' => 'Select Invoice / Invoices ...']
]); ?>

<?php $dataDebitNote = \yii\helpers\ArrayHelper::map(\app\models\finance\DebitNote::find()->all(), 'id', 'nomor_surat'); ?>
<?= $form->field($modelsBuktiPenerimaanDebitNote, 'debit_note_id')->widget(Select2::className(), [
    'data' => $dataDebitNote,
    'options' => ['multiple' => true, 'placeholder' => 'Select Debit Note / Debit Notes ...']
]); ?>

Yii2如何才能將其視為一對多關系。

更新

這是actionFindModel看起來像:

protected function findModel($id)
{
    if (($model = BuktiPenerimaan::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

請指教。

在“ BuktiPenerimaan”模型中,您定義了兩個一對多關系:“ getBuktiPenerimaanDebitNotes”和“ getBuktiPenerimaanInvoices”。

public function getBuktiPenerimaanDebitNotes(){
            return $this->hasMany(BuktiPenerimaanDebitNote::className(), ['bukti_penerimaan_id' => 'id']);
        }

        public function getBuktiPenerimaanInvoices(){
            return $this->hasMany(BuktiPenerimaanInvoice::className(), ['bukti_penerimaan_id' => 'id']);
        }

在actionCreate中,您已經創建了BuktiPenerimaanInvoice和BuktiPenerimaanDebitNote的實例。 然后,您加載發布數據並執行驗證。 這里一切都很好。

$modelsBuktiPenerimaanInvoice = new BuktiPenerimaanInvoice(); // to many record
    $modelsBuktiPenerimaanDebitNote = new BuktiPenerimaanDebitNote(); // to many record

但是,在actionUpdate中,您使用了下面的代碼,它返回給您一對多關系,這些關系是模型的集合(模型的數組):

$modelsBuktiPenerimaanInvoice = $model->buktiPenerimaanInvoices;
    $modelsBuktiPenerimaanDebitNote = $model->buktiPenerimaanDebitNotes;

您正在使用以下代碼執行驗證:

$modelsBuktiPenerimaanDebitNote->load($request->post())
            && $modelsBuktiPenerimaanInvoice->load($request->post())
            && Model::validateMultiple([$model, $modelsBuktiPenerimaanDebitNote, $modelsBuktiPenerimaanInvoice])) {

“ validateMultiple”調用每個指定模型的“ validate”方法。 其中兩個模型($ modelsBuktiPenerimaanDebitNote,$ modelsBuktiPenerimaanInvoice)是集合而不是對象。 因此,在集合上調用“驗證”會引發錯誤

"name":"PHP Fatal Error","message":"Call to a member function isAttributeRequired() on array","code":1,"type":"yii\\base\\ErrorException" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM