sql >> Databasteknik >  >> RDS >> Mysql

Hur man ställer in flervalsvärde från arrayobjekt i yii2 under uppdatering

Detta är ett exempel på en modellklass Permit som har en many to many relation med Activity genom PermitActivity (pivottabellmodell).

Modellklassaktivitet

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å så sätt är modellklassen den som är ansvarig för att skapa och uppdatera relationen med hjälp av pivottabellen.

Det viktigaste är att få relationsmetoden korrekt deklarerad.

Redigera

Det här är ett exempel på vyn som använder kartikv\widgets\Select2 . Jag vet inte riktigt om dropDownList stöder multiple select, men Select2 har så många användbara funktioner att jag vanligtvis använder det framför andra alternativ.

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



  1. Hur man skapar ett formulär med formulärguiden

  2. Ställ in AUTO_INCREMENT-värdet programmatiskt

  3. Distribuera Cloudera CDP Data Center på Oracle Cloud Infrastructure (OCI)

  4. Förbättra SQL Server-frågeprestanda på stora tabeller