sql >> Database >  >> RDS >> Mysql

Hoe de multi-select-waarde van het array-object in yii2 in te stellen tijdens het updaten?

Dit is een voorbeeldcode van een modelklasse Permit die een many to many . heeft relatie met Activity via PermitActivity (draaitafelmodel).

Modelklasactiviteit

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

Op deze manier is de modelklasse degene die verantwoordelijk is voor het maken en bijwerken van de relatie met behulp van de draaitabel.

Het belangrijkste is dat de relatiemethode correct wordt gedeclareerd.

Bewerken

Dit is een voorbeeld van de weergave met kartikv\widgets\Select2 . Ik weet niet echt of dropDownList multiple select ondersteunt, maar Select2 heeft zoveel handige functies dat ik het meestal gebruik boven andere opties.

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



  1. Hoe de volgende waarde van de SQL Server-reeks in Entity Framework te krijgen?

  2. Hoe gebruik je union slechts één keer met waar commando?

  3. verander tabelnaam in hoofdletters

  4. SQL SELECT met m:n-relatie