Как удалить элемент из модели, но не удалять из базы данных?
Есть список компаний, каждой компании может быть присвоено бесконечное количество "контактов". В БД две таблицы - клиенты и контакты. Создал третью, таблицу, в которой хранятся "связи", то есть два числа - id компании и id контакта.
При создании новой компании можно указать сразу всех контактов, допустим, есть comboBox со всеми контактами. Нажимаешь на выбранный, он исчезает из ComboBox, образуется связь, добавляемая в третью таблицу. Всё хорошо, но не пойму, как удалить элемент из ComboBox? Ему я присвоил отдельную модель вида QSqlQueryModel. То есть, мне не нужно удалять из базы данных ничего, мне просто нужно удалить элемент из модели, и при очередном создании новой компании эту модель обновить, снова заполнив всеми контактами. Какой моделью воспользоваться?
Сделал так:
assignment_contacts = new QSqlQueryModel();
assignment_contacts->setQuery("SELECT * FROM contacts");
ui->comboBox_newContacts->setModel(assignment_contacts);
ui->comboBox_newContacts->setModelColumn(1);
Выводятся в comboBox все контакты - всё верно, далее:
void MainWindow::on_comboBox_newContacts_activated(int index)
{
database::AddAssignment(QString::number(nextId), contactsModel->data(contactsModel->index(index,0),Qt::DisplayRole).toString());
QSqlQuery query;
query.prepare("SELECT * FROM assignment WHERE companyId = :companyId");
query.bindValue(":companyId", nextId);
if(!query.exec()){
qDebug() << query.lastError().text();
}
QSqlRecord rec = query.record();
int rowCount = assignment_contacts->rowCount();
while(query.next()){
for(int i = 0; i < rowCount; i++){
QVariant data = contactsModel->data(contactsModel->index(i,0),Qt::DisplayRole).toString();
if(data == query.value(rec.indexOf("contactId")).toString()){
ui->comboBox_newContacts->removeItem(index);
break;
}
}
}
Связь создается, в БД её видно. Если рядом с ui->comboBox_newContacts->removeItem(index); добавить вывод элементов - они выводятся, то есть всё работает правильно, однако элементы из comboBox не пропадают, хоть удаляя их напрямую (как в коде выше), хоть изменяя модель, при помощи removeRow(index)
Ответы (1 шт):
Решение оказалось довольно простым, всего лишь нужно было написать правильный запрос в бд, и исходя из этого запроса сделать новую модель.
query.prepare("SELECT id, fullName FROM contacts WHERE contacts.rowid NOT IN (SELECT contactId FROM assignment WHERE companyId = :nextId);");
query.bindValue(":nextId", nextId);
query.exec();
assignment_contacts->setQuery(std::move(query));
ui->comboBox_newContacts->setModel(assignment_contacts);
ui->comboBox_newContacts->setModelColumn(1);
Теперь при нажатии на comboBox я добавляю новый элемент в таблицу assignment, после чего обновляю модель вышеупомянутым запросом и всё заработало. А главное, код очень гибкий и работает как при удалении самой связи, так и при удалении самого контакта из базы данных.