我在persistence.js(http://persistencejs.org/)中返回的查询集合上使用filter方法遇到了一些有趣的行为
以下是我在调试器中运行的一些示例代码:
Bookmark.all().list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root` WHERE 1=1 []
0
1
2
显然,数据库中保存了三个Bookmark
个对象,每个对象的id为0,1和2.
但是,当我尝试使用运算符“in”过滤掉对象时。它开始返回一些时髦的结果。
Bookmark.all().filter('id','in',[0,1,2]).list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root` WHERE (1=1 AND `root`.`id` IN (?, ?, ?)) [0, 1, 2]
这个查询的结果都没有,过滤器本身不返回任何东西,这有点奇怪,考虑到我刚刚确认数据库中肯定有与这些参数匹配的对象。我也尝试了一个简单的相等测试。
Bookmark.all().filter('id','=',0).list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root` WHERE (1=1 AND `root`.`id` = ?) [0]
再次,没有命中。可能最奇怪的是如果我运行这个:
Bookmark.all().filter('id','<',2).list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root` WHERE (1=1 AND `root`.`id` < ?) [2]
0
1
2
但是2绝对不会少于2.我做错了什么?过滤器函数不会像这样工作似乎有点奇怪,特别是当它输出适当的SQL查询时。
更新 看起来这是@nrabinowitz解决方案的组合。我做了一些挖掘,结果发现在persistence.js的源代码中声明的默认idType是VARCHAR(32)。这解释了不良行为。