sql >> Databáze >  >> RDS >> Mysql

Jak nastavit hodnotu vícenásobného výběru z objektu pole v yii2 při aktualizaci

Toto je příklad kódu třídy modelu Permit který má many to many vztah s Activity prostřednictvím PermitActivity (model kontingenční tabulky).

Aktivita třídy modelů

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

Tímto způsobem je třída modelu odpovědná za vytváření a aktualizaci vztahu pomocí kontingenční tabulky.

Nejdůležitější je mít správně deklarovanou metodu vztahu.

Upravit

Toto je příklad zobrazení pomocí kartikv\widgets\Select2 . Opravdu nevím, jestli dropDownList podporuje vícenásobný výběr, ale Select2 má tolik užitečných funkcí, že ho obvykle používám před jinými možnostmi.

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



  1. Jak používat regexp ve sqlite

  2. Váš dokonalý průvodce SQL Joins:OUTER JOIN – část 2

  3. Jak správně vyčistím data přijatá z textové oblasti při jejich výstupu zpět do textové oblasti?

  4. Použití sloupce Oracle XMLType v režimu spánku