使用SailsJS一次更新多个记录

And*_*xio 8 sails.js waterline

所以我正在制作这个应用程序,我会为餐厅提供菜单项吗?

所有者应该能够移动菜单项

这是我的menuitem.js模型包含的

名称,价格,位置

而已.超级简单.

因此,为了重新定位这些元素,我将使用jquery UI,因此最终产品将与此类似> http://jqueryui.com/sortable/

因此,我的目标是每次更改其中一个菜单项时,将每个菜单项的位置保存在数据库中.所以我认为Sails必须有一个可以一次更新所有记录的功能

如下

Menuitem.update([{id: 1},{position: 3}], [{id: 2},{position: 3}] ).exec(function(err, updatedRecords) {
            if (err) {
                return res.send({message: 'Could not update the records', err: err}, 500);
            }

            if (updatedRecords) {
                return res.send({ records: updatedRecords }, 200);
            } else {
                return res.notFound('Records not found');
            }
        });
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激

还在SailsJS上打开了一个问题 https://github.com/balderdashy/sails/issues/2404

Man*_*ngh 0

您可以使用本机 SQL 查询来实现此目的。要执行本机SQL查询,您需要使用waterline的Model.query()函数。在你的情况下,它会是这样的。

var myQuery = "update menuitem set ....   complete SQL query goes here ";

Menuitem.query(myQuery, function (err, result){
  if(err){
    // error handling here
  }
  else{
    // do something with result here
  }
});
Run Code Online (Sandbox Code Playgroud)

现在,对于您的本机 SQL 查询,您可以使用 case 语句根据位置值更新行。例如,如果我将项目从位置 4 移动到位置 2,那么我的查询将如下所示。

update menuitem
set position = case when position = 4 then 2
               when position >=2 then position + 1 
               else position end;
Run Code Online (Sandbox Code Playgroud)

当然,4 和 2 将动态提供,您的查询可能看起来更复杂,因为您还需要处理用户是否向上或向下移动对象。但这就是实现这一目标的方法。如果您需要执行更复杂的逻辑,您也可以创建存储过程。这也将通过使用 Model.query 来执行。使用最终用户提供的参数构建动态查询时,请谨防 SQL 注入攻击。