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
с полямиid
,record_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
и преобразование массива в строку при сохранении — это рабочий вариант.