sql >> Database teknologi >  >> RDS >> Mysql

Sådan indstilles multi select-værdi fra array-objekt i yii2 under opdatering

Dette er et eksempel på en modelklasse Permit som har en many to many forhold til Activity gennem PermitActivity (pivottabelmodel).

Modelklasseaktivitet

public class Permit extends \yii\db\ActiveRecord {
    public $activities_ids;
    ...
    public function rules() {
        return [
            ...
            [['activities_ids'], 'safe'],
            ...
        ];
    }
    ...
    // Method called after record is saved, be it insert or update.
    public function afterSave($insert, $changedAttributes) {
        // If this is not a new record, unlink all records related through relationship 'activities'
        if(!$this->isNewRecord) {
            // We unlink all related records from the 'activities' relationship.
            $this->unlinkAll('activities', true);
            // NOTE: because this is a many to many relationship, we send 'true' as second parameter
            // so the records in the pivot table are deleted. However on a one to many relationship
            // if we send true, this method will delete the records on the related table. Because of this,
            // send false on one to many relationships if you don't want the related records deleted.
        }

        foreach($this->activities_ids as $activity_id) {
            // Find and link every model from the array of ids we got from the user.
            $activity = Activity::findOne($activity_id);
            $this->link('activities', $activity);
        }

        parent::afterSave($insert, $changedAttributes);
    }
    ...
    // Declare relationship with Activity through the pivot table permitActivity
    public function getActivities(){
        return $this->hasMany(Activitiy::className(), ['id' => 'activity_id'])
            ->viaTable('permitActivity',['permit_id' => 'id']);
    }
    ...
    public function afterFind(){
        parent::afterFind();
        $this->activities_id = ArrayHelper::getColumn($this->activities, 'id');
    }
}

På denne måde er modelklassen den, der er ansvarlig for at skabe og opdatere relationen ved hjælp af pivottabellen.

Det vigtigste er at få relationsmetoden erklæret korrekt.

Rediger

Dette er et eksempel på visningen, der bruger kartikv\widgets\Select2 . Jeg ved ikke rigtig, om dropDownList understøtter multiple select, men Select2 har så mange nyttige funktioner, at jeg normalt bruger det frem for andre muligheder.

echo $form->field($model, 'activities')->widget(Select2::classname(), [
    'data' => $data,
    'options' => [
        'placeholder' => '...'
    ],
    'pluginOptions' => [
        'allowClear' => true,
        'multiple' => true,
    ],
]);



  1. SQL:Hvordan finder man dubletter baseret på to felter?

  2. hvad sker der i adoptionsfasen forberede

  3. Største værdi af flere kolonner med kolonnenavn?

  4. Problem med Tomcat-pooling med Hibernate. MySQL timeout