Sails策略 - 搜索关联

时间:2015-08-31 21:41:54

标签: javascript node.js mongodb sails.js waterline

假设我有一个模型用户,可以有多个房屋。这些房屋可以有多个停车位,然后可以有多个汽车自行车

用户>房屋>停车位> [汽车,自行车]

如何检查汽车是否与用户相关?

比方说,例如,当用户(当前登录的用户)想要编辑或删除汽车时,我想检查他是否是该汽车的所有者。当他想在房子或停车位上进行动作时也是如此。

由于模型用户不直接与模型车或停车位相关联,检查对象是否与用户相关的最佳方法是什么? 有没有办法查找“第一级协会”?

提前致谢

丹尼斯

2 个答案:

答案 0 :(得分:1)

如果汽车或自行车只能由一个用户拥有,您可以随时在汽车中添加用户ID关联模型并从那里开始工作,否则您可以使用大量子查询进行硬SQL查询:

"SELECT car.name, car.id, car.parkingspot FROM cars, parkingspots, houses, users WHERE
    car.parkingspotID = parkingspot.ID
    AND
    parkingspot.houseID = house.ID
    AND
    house.userID = MY_USERID
"

答案 1 :(得分:1)

我猜您在模型中定义了所有这些one-to-many relations

然后你就可以找到与汽车相关的用户:

  • 从车上取回停车场
  • 当你停车时,找回房子
  • 当你有房子时,你可以检索用户

以下是使用回调的简单示例:

Car.findOne({id: 1}).exec(function(err, car) {
  Parking.findOne({id: car.parking}).exec(function(err, parking) {
    House.findOne({id: parking.house}).exec(function(err, house) {
      res.json(house.user); // <= returns the user id
    });
  });
});

要减少通话次数,您可以使用populate()方法:

Car.findOne({id: 1}).populate('parking').exec(function(err, car) {
  House.findOne({id: car.parking.house}).populate('user').exec(function(err, house) {
    res.json(house.user); // returns the user object
  });
});

您还可以使用promise API以不同方式组织异步代码。