2014-12-29 70 views
4

海蘭那裏,sailsjs /水線查詢「其中」非空

纔去哈克/對自定義方式,我想知道是否有一個內置的query的方式來檢查空/非空多對多關係,因爲我在谷歌和文檔上都沒有成功。

如果我拿着文檔中的例子,讓我們想象一下,只有當他有一個寵物或沒有任何所有者的寵物通過查詢後才能檢索用戶。

// A user may have many pets 
var User = Waterline.Collection.extend({ 

    identity: 'user', 
    connection: 'local-postgresql', 

    attributes: { 
    firstName: 'string', 
    lastName: 'string', 

    // Add a reference to Pet 
    pets: { 
     collection: 'pet', 
     via: 'owners', 
     dominant: true 
    } 
    } 
}); 

// A pet may have many owners 
var Pet = Waterline.Collection.extend({ 

    identity: 'pet', 
    connection: 'local-postgresql', 

    attributes: { 
    breed: 'string', 
    type: 'string', 
    name: 'string', 

    // Add a reference to User 
    owners: { 
     collection: 'user', 
     via: 'pets' 
    } 
    } 
}); 

P.我知道如何過濾查詢執行後的結果,這不是我要問:)

回答

2

沒有什麼建(又名User.hasPet())或類似的東西。就是這麼簡單的答案是NO

如果我事先知道這些問題,我傾向於以這樣的方式編寫我的數據庫,以便查詢速度更快。 IE:用戶模式將有一個hasPets列。無論何時添加/刪除寵物,回叫都會觸發用戶表,以在該字段中包含所有者時標記該字段。那麼我可以查詢User.findAll({hasPet:true})。

它有點多,但它取決於你需要的速度。

+0

海蘭,THX你的答案,我將它添加到了「哈克」的方式一個:)我也聽說一些適配器有一個Model.query(「putyournativesqlhere」)。就我而言,目前我只是在查詢完成後運行「.filter」函數。我認爲waterlines錯過了一種「WQL」(水線查詢語言:)),但它仍然是一個年輕的ORM,所以我們等一下:) – MrVinz

2

這有點晚,但我想讓你知道,使用Waterline ORM生命週期函數很容易做到這一點。我已經在我的一些項目中完成了它。基本上,使用beforeCreate和beforeUpdate函數來設置你的標誌。對於你的用戶,它可能看起來像......

var User = Waterline.Collection.extend({ 

    identity: 'user', 
    connection: 'local-postgresql', 

    beforeCreate: function(values, next) { 
    if (values.pets) { 
     values.has_pet = true; 
    } else { 
     values.has_pet = false; 
    } 
    next(); 
    } 

    beforeUpdate: function(values, next) { 
    if (values.pets) { 
     values.has_pet = true; 
    } else { 
     values.has_pet = false; 
    } 
    next(); 
    } 

    attributes: { 
    firstName: 'string', 
    lastName: 'string', 

    // Add a reference to Pet 
    pets: { 
     collection: 'pet', 
     via: 'owners', 
     dominant: true 
    }, 

    has_pet: { 
     type: 'boolean' 
    } 
    } 
}); 

然後你就可以查詢基礎上,has_pet屬性

+0

Hy,感謝您的回覆,我認爲它是Hacky方式的一部分;) – MrVinz