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,
],
]);