#node.js #knex.js
#node.js #knex.js
Вопрос:
У меня есть две таблицы, адреса и пользователи, у каждого пользователя есть адрес, в таблице users есть столбец ‘address_id’, который ссылается на строку в таблице адресов. Но, когда я удаляю пользователя, строка адреса не удаляется. Почему?
table_users:
exports.up = function(knex) {
return knex.schema.createTable('users', function(table) {
table.increments('id')
table.text('name')
table.text('cpf').unique()
table.text('email').unique()
table.text('pass')
table.text('phone')
table.timestamp('last_access').defaultTo(knex.fn.now())
table.timestamp('created_at').defaultTo(knex.fn.now())
table.timestamp('deleted_at').defaultTo(null)
table.integer('address_id').unsigned()
table.foreign('address_id').references('addresses.id').onDelete('CASCADE')
})
};
exports.down = function(knex) {
return knex.schema.dropTable('users')
};
table_addresses:
exports.up = function(knex) {
return knex.schema.createTable('addresses', function(table) {
table.increments('id')
table.text('street')
table.text('number')
table.text('complement')
table.text('city')
table.text('state')
table.text('country')
table.timestamp('last_access').defaultTo(knex.fn.now())
table.timestamp('created_at').defaultTo(knex.fn.now())
table.timestamp('deleted_at').defaultTo(null)
})
};
exports.down = function(knex) {
return knex.schema.dropTable('addresses')
};
функция del:
const del = (req, res, next) => { // TODO: colocar transaction aqui também
knex('users').where({
id: req.userData.id
}).first().del().then(r => {
if (!r) {
throw new CompleteError('Falha ao deletar usuário.', 400)
}
res.status(200).json({
sucess: true,
data: {
message: 'Usuário deletado com sucesso.'
}
})
}).catch(e => {
return next(e)
})
}
Комментарии:
1. Если вы используете SQLite3 iirc, вам необходимо настроить некоторую прагму для поддержки внешних ключей.
Ответ №1:
С вашим текущим определением ссылка работает в обратном направлении, это означает, что когда вы удаляете адрес, он удаляет пользователя, на которого ссылается.
Если вы хотите, чтобы всякий раз, когда вы удаляете пользователя, это приводило к удалению адреса, вам нужно добавить ссылку в таблицу адресов на пользователя с onDelete('cascade')
.