sql >> Base de Datos >  >> RDS >> Mysql

Cómo establecer el valor de selección múltiple del objeto de matriz en yii2 mientras se actualiza

Este es un código de ejemplo de una clase modelo Permit que tiene un many to many relación con Activity a través de PermitActivity (modelo de mesa pivotante).

Actividad de clase modelo

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 esta manera, la clase modelo es la responsable de crear y actualizar la relación utilizando la tabla dinámica.

Lo más importante es tener el método de relación declarado correctamente.

Editar

Este es un ejemplo de la vista usando kartikv\widgets\Select2 . Realmente no sé si dropDownList admite selección múltiple, sin embargo, Select2 tiene tantas funciones útiles que generalmente lo uso sobre otras opciones.

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