Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So legen Sie beim Aktualisieren den Mehrfachauswahlwert aus dem Array-Objekt in yii2 fest

Dies ist ein Beispielcode einer Modellklasse Permit die einen many to many hat Beziehung mit Activity durch PermitActivity (Pivot-Table-Modell).

Klassenaktivität modellieren

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

Auf diese Weise ist die Modellklasse für die Erstellung und Aktualisierung der Beziehung mithilfe der Pivot-Tabelle verantwortlich.

Das Wichtigste ist, dass die Beziehungsmethode korrekt deklariert ist.

Bearbeiten

Dies ist ein Beispiel für die Ansicht mit kartikv\widgets\Select2 . Ich weiß nicht wirklich, ob dropDownList Mehrfachauswahl unterstützt, aber Select2 hat so viele nützliche Funktionen, dass ich es normalerweise anderen Optionen vorziehe.

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