问题描述
我有两个表,地址和用户,每个用户都有一个地址,表用户中有一列“ 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)
})
}
解决方法
在您当前的定义下,引用将反向运行,这意味着,无论何时删除地址,它都会删除引用的用户。
如果您希望每当删除用户时都会删除该地址,则需要在地址表中为具有onDelete('cascade')
的用户添加引用