Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment définir la valeur de sélection multiple à partir de l'objet tableau dans yii2 lors de la mise à jour

Ceci est un exemple de code d'une classe de modèle Permit qui a un many to many relation avec Activity via PermitActivity (modèle de tableau croisé dynamique).

Activité de classe modèle

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');
    }
}

De cette façon, la classe de modèle est responsable de la création et de la mise à jour de la relation à l'aide du tableau croisé dynamique.

Le plus important est que la méthode de relation soit déclarée correctement.

Modifier

Ceci est un exemple de la vue utilisant kartikv\widgets\Select2 . Je ne sais pas vraiment si dropDownList prend en charge la sélection multiple, mais Select2 a tellement de fonctionnalités utiles que je l'utilise généralement sur d'autres options.

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