Для реализации хранения приглашённых участников в поле типа SET в MySQL и работы с этим полем через элементы формы в Yii2, нужно учитывать несколько моментов. Вот пошаговое руководство:

1. Создание поля в MySQL

Поле типа SET в MySQL позволяет хранить несколько значений из заранее определённого набора. Однако, в вашем случае, вы хотите хранить первичные ключи участников. Это возможно, но не совсем рекомендуется, так как SET имеет ограничения (например, фиксированный список значений). Лучше использовать поле типа JSON или TEXT для хранения массива идентификаторов участников. Но если вы всё же хотите использовать SET, создайте поле следующим образом:

sql

ALTER TABLE your_table ADD COLUMN participants SET('1', '2', '3', '4', '5');

Здесь '1', '2', '3', '4', '5' — это возможные значения (идентификаторы участников). Если список участников будет динамическим, лучше использовать другой подход (например, JSON).


2. Модель в Yii2

В модели Yii2 нужно указать, что поле participants может содержать массив значений. Для этого можно использовать валидатор each или написать собственный валидатор.Пример модели:

php

class YourModel extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'your_table';
    }

    public function rules()
    {
        return [
            [['participants'], 'safe'], // Разрешаем безопасное сохранение
        ];
    }
}


3. Элемент формы

Для работы с полем SET в форме можно использовать виджет CheckboxList или Select2 (с множественным выбором). Пример с использованием CheckboxList:

php

use yii\helpers\ArrayHelper;
use yii\widgets\ActiveForm;

// Получаем список участников из таблицы
$participants = \app\models\Participant::find()->select(['name', 'id'])->asArray()->all();
$participantList = ArrayHelper::map($participants, 'id', 'name');

// Форма
$form = ActiveForm::begin();
echo $form->field($model, 'participants')->checkboxList($participantList);
ActiveForm::end();

Здесь:

  • Participant — это модель таблицы участников.
  • ArrayHelper::map преобразует массив участников в формат id => name.

4. Сохранение данных

При сохранении данных из формы нужно преобразовать массив значений в строку, так как MySQL SET хранит данные в виде строки.Пример в контроллере:

php

if ($model->load(Yii::$app->request->post())) {
    // Преобразуем массив в строку
    $model->participants = implode(',', $model->participants);
    if ($model->save()) {
        Yii::$app->session->setFlash('success', 'Данные сохранены!');
        return $this->redirect(['view', 'id' => $model->id]);
    }
}


5. Отображение данных

При выводе данных из поля SET нужно преобразовать строку обратно в массив:

php

$participants = explode(',', $model->participants);

Затем можно использовать этот массив для отображения, например, списка участников.


6. Рекомендация

Использование SET в MySQL имеет ограничения:

  • Нельзя динамически добавлять новые значения в список.
  • Сложно масштабировать и поддерживать.

Лучше использовать поле типа JSON или отдельную таблицу для связи участников с записью (многие-ко-многим). Например:

  • Создайте таблицу invited_participants с полями idrecord_id (ID записи) и participant_id (ID участника).
  • Используйте реляции в Yii2 для работы с этой таблицей.

Пример реляции в модели:

php

public function getInvitedParticipants()
{
    return $this->hasMany(Participant::class, ['id' => 'participant_id'])
        ->viaTable('invited_participants', ['record_id' => 'id']);
}


Заключение

Хотя SET можно использовать, это не самый гибкий подход. Рекомендуется использовать JSON или отдельную таблицу для хранения участников. Если вы всё же хотите использовать SET, настройка через CheckboxList и преобразование массива в строку при сохранении — это рабочий вариант.