2011-12-06 35 views
45

Có cách nào để viết truy vấn xóa/xóaTất cả như findAll không?Sequelize.js xóa truy vấn?

Ví dụ tôi muốn làm một cái gì đó như thế này (giả sử MyModel là một mô hình Sequelize ...):

MyModel.deleteAll({ where: ['some_field != ?', something] }) 
    .on('success', function() { /* ... */ }); 

Trả lời

98

Đối với bất cứ ai sử dụng Sequelize phiên bản 3 trở lên, sử dụng:

Model.destroy({ 
    where: { 
     // criteria 
    } 
}) 

Sequelize Documentation - Sequelize Tutorial

+0

đây không phải là câu trả lời được chấp nhận? 1 cho bạn ạ. – Rojuinex

+0

Đó là một câu hỏi khá cũ nên tại thời điểm tôi đoán Sequelize không có phương pháp tiêu diệt đáng ngạc nhiên – ncksllvn

+2

Đủ công bằng; mặc dù vì đây là kết quả tìm kiếm đầu tiên trên Google và mọi người cũng không được khuyến khích khi đặt câu hỏi đã được hỏi, có vẻ như câu trả lời được chấp nhận sẽ được cập nhật ... nhưng đó có thể là vấn đề lớn hơn. – Rojuinex

18

Tôi đã tìm kiếm sâu vào mã, từng bước vào các tập tin sau đây:

https://github.com/sdepold/sequelize/blob/master/test/Model/destroy.js

https://github.com/sdepold/sequelize/blob/master/lib/model.js#L140

https://github.com/sdepold/sequelize/blob/master/lib/query-interface.js#L207-217

https://github.com/sdepold/sequelize/blob/master/lib/connectors/mysql/query-generator.js

Những gì tôi thấy:

Không có một phương pháp deleteAll, có một phương pháp tiêu diệt(), bạn có thể gọi về một kỷ lục, ví dụ:

Project.find(123).on('success', function(project) { 
    project.destroy().on('success', function(u) { 
    if (u && u.deletedAt) { 
     // successfully deleted the project 
    } 
    }) 
}) 
+0

Yeah, tôi biết về phá hủy phương pháp, nhưng tiếc là nó chỉ cho một bản ghi. Tôi đoán tôi sẽ phải viết phương thức deleteAll của riêng mình. Cảm ơn! – lakenen

+0

Thật kỳ lạ là điều này không tồn tại. Có lẽ bạn có thể tự viết nó và gửi yêu cầu kéo để sắp xếp lại. Tôi chắc rằng những người khác có thể thực sự sử dụng nó. – alessioalex

+0

Vui lòng gửi yêu cầu kéo hoặc mở một vấn đề trong kho lưu trữ github :) – sdepold

2

tôi đã viết một cái gì đó như thế này cho Sails một thời gian trở lại, trong trường hợp nó giúp bạn tiết kiệm một thời gian:

Ví dụ cách sử dụng:

// Delete the user with id=4 
User.findAndDelete(4,function(error,result){ 
    // all done 
}); 

// Delete all users with type === 'suspended' 
User.findAndDelete({ 
    type: 'suspended' 
},function(error,result){ 
    // all done 
}); 

Nguồn:

/** 
* Retrieve models which match `where`, then delete them 
*/ 
function findAndDelete (where,callback) { 

    // Handle *where* argument which is specified as an integer 
    if (_.isFinite(+where)) { 
     where = { 
      id: where 
     }; 
    } 

    Model.findAll({ 
     where:where 
    }).success(function(collection) { 
     if (collection) { 
      if (_.isArray(collection)) { 
       Model.deleteAll(collection, callback); 
      } 
      else { 
       collection.destroy(). 
       success(_.unprefix(callback)). 
       error(callback); 
      } 
     } 
     else { 
      callback(null,collection); 
     } 
    }).error(callback); 
} 

/** 
* Delete all `models` using the query chainer 
*/ 
deleteAll: function (models) { 
    var chainer = new Sequelize.Utils.QueryChainer(); 
    _.each(models,function(m,index) { 
     chainer.add(m.destroy()); 
    }); 
    return chainer.run(); 
} 

từ: orm.js.

Hy vọng điều đó sẽ hữu ích!

15

Không biết câu hỏi vẫn còn phù hợp nhưng tôi đã tìm thấy những điều sau về tài liệu của Sequelize.

User.destroy('`name` LIKE "J%"').success(function() { 
    // We just deleted all rows that have a name starting with "J" 
}) 

http://sequelizejs.com/blog/state-of-v1-7-0

Hy vọng nó sẽ giúp!

+1

Để tham khảo, điều này được định nghĩa trong [lib/model.js] (https://github.com/sequelize/sequelize/blob/51ce2fb7f60359fc04814afe6779bb0ada41b18d/lib/model.js#L1272) và bạn không phải sử dụng chuỗi. Bạn có thể sử dụng bất kỳ loại đối tượng 'where' nào (ví dụ:' {someId: 123} '). – Domi

7

Ví dụ này cho thấy làm thế nào để bạn hứa hẹn thay vì gọi lại.

Model.destroy({ 
    where: { 
     id: 123 //this will be your id that you want to delete 
    } 
}).then(function(rowDeleted){ // rowDeleted will return number of rows deleted 
    if(rowDeleted === 1){ 
    console.log('Deleted successfully'); 
    } 
}, function(err){ 
    console.log(err); 
}); 

Kiểm tra liên kết này ra để biết thêm http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger

+0

không nên rowDeleted được 1 khi kiểm tra để xóa thành công một hàng? – saraf

+0

Có quyền. Cảm ơn đã chỉ ra điều đó. –

2

Trong phiên bản mới, bạn có thể thử một cái gì đó như thế này

function (req,res) {  
     model.destroy({ 
      where: { 
       id: req.params.id 
      } 
     }) 
     .then(function (deletedRecord) { 
      if(deletedRecord === 1){ 
       res.status(200).json({message:"Deleted successfully"});   
      } 
      else 
      { 
       res.status(404).json({message:"record not found"}) 
      } 
     }) 
     .catch(function (error){ 
      res.status(500).json(error); 
     }); 
Các vấn đề liên quan