Yii2:如何验证关系?

时间:2018-09-11 12:30:14

标签: validation yii2 relation

我有一个模型,其关系称为“评论”:

 CREATE OR REPLACE FUNCTION tsi.update_data(_creation_time int)
 RETURNS VOID

    AS $$
    BEGIN
        EXECUTE format($sql$
            UPDATE tsi.forecasts_%s a SET
            "incidents @ %s" = b.n_incid,
            "road @ %s" = b.n_roads
            FROM tgi_tmp b WHERE a.link_ix = b.link_id;
      $sql$,_creation_time, '01:00', '01:00');
    END $$ LANGUAGE plpgsql;

在View中,评论由GridView小部件显示。用户可以通过另一个视图添加或删除评论。用户应至少指定一项评论。我将验证规则添加到模型中:

class ReportStructure extends \yii\db\ActiveRecord
{

    const REVIEW_LIST_NAME = 'reviews';

    public function getReviewList()
    {
        return $this->hasOne(FileIndexList::className(), ['id_owner' => 'id_report'])
            ->where('list_name = :list_name', [':list_name' => self::REVIEW_LIST_NAME]);
    }

    public function getReviews()
    {
        return $this->hasMany(FileIndex::className(), ['id_file_index' => 'id_file_index'])->via('reviewList');
    }
}

但似乎该规则甚至没有被解除。

public function rules()
{
    return [
        ['reviews', 'checkReviews'],
    ];
}

public function checkReviews($attribute)
{
    if (count($this->reviews) === 0) {
        $this->addError($attribute, 'You should add at least one review');
    }
}

这就是初始化数据的方式。 $ elements是一类的对象,我使用表格输入。

public function actionIndex($idSupply, $restoreTab = false) {

    $this->initData($idSupply, $report, $reestrData, $structure, $elements);

    $ok = $report->load(Yii::$app->request->post()) &&
            $reestrData->load(Yii::$app->request->post()) &&
            Model::loadMultiple($elements, Yii::$app->request->post());

    if($ok) {
        $ok = $report->validate() &&
                $reestrData->validate() &&
                Model::validateMultiple($elements) &&
                $structure->validate();

        if($ok) {
            $report->id_status = Status::STATUS_VERIFIED;
            $this->saveData($report, $reestrData, $structure, $elements);
            return $this->redirect(['supplies/update', 'id' => $idSupply]);
        }
    }
    return $this->render('index', [
                'structure' => $structure,
                'report' => $report,
                'reestrData' => $reestrData,
                'elements' => $elements,
                'restoreTab' => $restoreTab
    ]);
}

以及如何保存数据:

private function initData($idSupply, &$report, &$reestrData, &$structure, &$elements) {
        $report = \app\models\Reports::findOne($idSupply);
        $reestrData = \app\models\ReestrData::findOne($report->id_reestr_data);
        $structure = \app\models\report\ReportStructure::findOne($report->id_supply);

        $elements = [
            'titleIndex' => FileIndex::getInstance($structure->id_title_index, $structure->getAttributeLabel('id_title_index')),
            'abstractIndex' => FileIndex::getInstance($structure->id_abstract_index, $structure->getAttributeLabel('id_abstract_index')),
            'technicalSpecificationIndex' => FileIndex::getInstance($structure->id_technical_specification_index, $structure->getAttributeLabel('id_technical_specification_index')),
            'contentsIndex' => FileIndex::getInstance($structure->id_contents_index, $structure->getAttributeLabel('id_contents_index')),
            'imageListIndex' => FileIndex::getInstance($structure->id_image_list_index, $structure->getAttributeLabel('id_image_list_index'), false),
            'tableListIndex' => FileIndex::getInstance($structure->id_table_list_index, $structure->getAttributeLabel('id_table_list_index'), false),
            'textAnnexListIndex' => FileIndex::getInstance($structure->id_text_annex_list_index, $structure->getAttributeLabel('id_text_annex_list_index'), false),
            'graphAnnexListIndex' => FileIndex::getInstance($structure->id_graph_annex_list_index, $structure->getAttributeLabel('id_graph_annex_list_index'), false),
            'glossaryIndex' => FileIndex::getInstance($structure->id_glossary_index, $structure->getAttributeLabel('id_glossary_index'), false),
            'reportIntroductionIndex' => FileIndex::getInstance($structure->id_report_introduction_index, $structure->getAttributeLabel('id_report_introduction_index')),
            'reportMainPartIndex' => FileIndex::getInstance($structure->id_report_main_part_index, $structure->getAttributeLabel('id_report_main_part_index')),
            'reportConclusionIndex' => FileIndex::getInstance($structure->id_report_conclusion_index, $structure->getAttributeLabel('id_report_conclusion_index')),
            'bibliographyIndex' => FileIndex::getInstance($structure->id_bibliography_index, $structure->getAttributeLabel('id_bibliography_index')),
            'metrologicalExpertiseIndex' => FileIndex::getInstance($structure->id_metrologicalexpertise_index, $structure->getAttributeLabel('id_metrologicalexpertise_index')),
            'patentResearchIndex' => FileIndex::getInstance($structure->id_patent_research_index, $structure->getAttributeLabel('id_patent_research_index')),
            'costStatementIndex' => FileIndex::getInstance($structure->id_cost_statement_index, $structure->getAttributeLabel('id_cost_statement_index')),
        ];
    }

2 个答案:

答案 0 :(得分:0)

我最终决定完全不对关系使用验证,而只是在控制器中检查评论数:

if (count($structure->reviews) === 0) {
                $ok = false;
                Yii::$app->session->setFlash('danger', 'You should add at least one review!');

}

答案 1 :(得分:0)

我认为最好在beforeDelete方法中进行检查。 您可以将此方法添加到模型中,并检查(如果只有它),然后返回false。

public function beforeDelete()
{
    if (!parent::beforeDelete()) {
        return false;
    }

    if(self::find()->count() >1)
        return true;
    else
        return false;
}