Yii2 wbraganca-dynamicform updation using yii2-trait relation not deleting elements

Based on https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY) , I am trying to implement dynamic forms. The creation works fine, but in the "Update" form, if I delete any element of the dynamic form, it is not deleted, but if I add the "Update" action, it will be saved. This is my update code.

public function actionUpdate($id)
{
    $modelAlumni = $this->findModel($id);
    $modelsJob = $modelAlumni->jobs;


    if ($modelAlumni->loadAll(Yii::$app->request->post()) && $modelAlumni->saveAll()) {
        return $this->redirect(['view', 'id' => $modelAlumni->id]);
    } else {
        return $this->render('update', [
            'modelAlumni' => $modelAlumni,
            'modelsJob' => (empty($modelsJob)) ? [new Job] : $modelsJob
        ]);
   }
}

Why doesn't he delete?

This is my graduate model.

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "alumni".
 *
 * @property integer $id
 * @property string $name
 * @property integer $gender
 * @property integer $contact_number
 * @property string $year_graduated
 * @property string $qualification
 * @property integer $department_id
 * @property integer $specialization
 * @property string $email
 *
 * @property Job[] $jobs
 */
class Alumni extends \yii\db\ActiveRecord
{
     use \mootensai\relation\RelationTrait;
     public $organization;
     public $designation;
     public $location;
     public $current_status;
     public $joining_date;


    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'alumni';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name', 'gender',   'contact_number', 'year_graduated', 'qualification', 'department_id', 'specialization', 'email'], 'required'],
            [['name', 'organization', 'designation', 'location'], 'string'],
            [['gender',   'contact_number', 'department_id', 'specialization'], 'integer'],
            [['year_graduated'], 'safe'],
            [['qualification', 'email'], 'string', 'max' => 500],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'name' => Yii::t('app', 'Name'),
            'gender' => Yii::t('app', 'Gender'),

            'contact_number' => Yii::t('app', 'Contact Number'),
            'year_graduated' => Yii::t('app', 'Year Graduated'),
            'qualification' => Yii::t('app', 'Qualification'),
            'department_id' => Yii::t('app', 'Department ID'),
            'specialization' => Yii::t('app', 'Specialization'),
            'email' => Yii::t('app', 'Email'),

        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getJobs()
    {
        return $this->hasMany(Job::className(), ['alumni_id' => 'id']);
    }
}

Here is my work model

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "job".
 *
 * @property integer $job_id
 * @property string $organization
 * @property string $current_status
 * @property string $designation
 * @property string $joining_date
 * @property string $location
 * @property integer $alumni_id
 *
 * @property Alumni $alumni
 */
class Job extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'job';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['organization', 'current_status', 'designation', 'joining_date', 'location', 'alumni_id'], 'required'],
            [['organization'], 'string'],
            [['joining_date'], 'safe'],
            [['alumni_id'], 'integer'],
            [['current_status', 'designation'], 'string', 'max' => 300],
            [['location'], 'string', 'max' => 255],
            [['alumni_id'], 'exist', 'skipOnError' => true, 'targetClass' => Alumni::className(), 'targetAttribute' => ['alumni_id' => 'id']],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'job_id' => Yii::t('app', 'Job ID'),
            'organization' => Yii::t('app', 'Organization'),
            'current_status' => Yii::t('app', 'Current Status'),
            'designation' => Yii::t('app', 'Designation'),
            'joining_date' => Yii::t('app', 'Joining Date'),
            'location' => Yii::t('app', 'Location'),
            'alumni_id' => Yii::t('app', 'Alumni ID'),
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAlumni()
    {
        return $this->hasOne(Alumni::className(), ['id' => 'alumni_id']);
    }
}
+6
source share
1 answer

There is an example, look at actionUpdate

https://github.com/wbraganca/yii2-dynamicform

, POST

        $oldIDs = ArrayHelper::map($modelsAddress, 'id', 'id');
        $modelsAddress = Model::createMultiple(Address::classname(), $modelsAddress);
        Model::loadMultiple($modelsAddress, Yii::$app->request->post());
        $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsAddress, 'id', 'id')));

mainModel :

if (! empty($deletedIDs)) 
{
   Address::deleteAll(['id' => $deletedIDs]);
}

, .

, triat: https://github.com/mootensai/yii2-relation-trait/issues/27

,

+1

Source: https://habr.com/ru/post/1016723/


All Articles