2014-07-14 21 views
5

Waterline是否支持執行SQL連接(除了query())?我在模型中建立了關聯,但生成的實際SQL查詢是循環選擇語句。目前是否只支持「n + 1選擇」?我在某處丟失配置選項嗎?Sails Waterline SQL加入填充

這裏是一個1->許多填充正在循環選擇語句的一個例子: (帆/水線/帆MySQL的v0.10.0-RC8)

/** 
* City.js 
*/ 
module.exports = { 
"adapter": "someMysqlServer", 
"tableName": "city", 
autoCreatedAt: false, 
autoUpdatedAt: false, 
schema: true, 
attributes: { 
    "id": { 
     "type": "integer", 
     "primaryKey": true, 
     "autoIncrement": true, 
     "columnName": "ID" 
    }, 
    "Name": { 
     "type": "string", 
     "maxLength": 35 
    }, 
    "District": { 
     "type": "string", 
     "maxLength": 20 
    }, 
    "Population": { 
     "type": "integer" 
    }, 
    "CountryCode": { 
     //a city has one country 
     "model": "Country" 
    } 
}}; 




/** 
* Country.js 
*/ 

module.exports = { 
    "adapter": "someMysqlServer", 
    "tableName": "country", 
    autoCreatedAt: false, 
    autoUpdatedAt: false, 
    schema: true, 
    attributes: { 
     "id": { 
      "type": "string", 
      "required": true, 
      columnName: "Code", 
      "primaryKey": true, 
      "maxLength": 3 
     }, 
     "Name": { 
      "type": "string", 
      "maxLength": 52 
     }, 
     Continent: "string", 
     "Region": { 
      "type": "string", 
      "maxLength": 26 
     }, 
     SurfaceArea: "float", 
     IndepYear: "integer", 
     Population: "integer", 
     LifeExpectancy: "float", 
     GNP: "float", 
     GNPOld: "float", 
     LocalName: "string", 
     GovernmentForm: "string", 
     HeadOfState: "string", 
     Capital: "integer", 
     Code2: "string", 
     Cities: { 
      //country has many cities 
      "collection": "City", 
      "via": "CountryCode" 
     } 
    } 
}; 

然後,當我導航到http://localhost:1337/country?populate=[Cities]我日誌顯示以下SQL被執行:

SELECT `country`.`Name`, `country`.`Continent`, `country`.`Region`, `country`.`SurfaceArea`, `country`.`IndepYear`, `country`.`Population`, `country`.`LifeExpectancy`, `country`.`GNP`, `country`.`GNPOld`, `country`.`LocalName`, `country`.`GovernmentForm`, `country`.`HeadOfState`, `country`.`Capital`, `country`.`Code2`,`country`.`Code` FROM `country` LIMIT 30 OFFSET 0 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ABW' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AFG' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AGO' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AIA' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ALB' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AND' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ANT' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ARE' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ARG' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ARM' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ASM' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ATA' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ATF' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ATG' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AUS' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AUT' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AZE' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BDI' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BEL' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BEN' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BFA' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BGD' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BGR' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BHR' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BHS' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BIH' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BLR' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BLZ' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BMU' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BOL' LIMIT 30 
+0

我遇到同樣的問題。測試我是否使用?populate = [model] url我得到相同的行爲。如果我明確調用Model.find()。populate('OtherModel'),我會得到一個稍微更優化的版本(使用IN),但仍然沒有連接。 – Rowan

回答

1

在測試的.populate()實施故意簡化支持儘可能廣泛的組適配器。在最後的v0.10發行版中,受支持的「核心」SQL適配器(sails-mysql和sails-postgresql)將執行實際的連接。

+0

@ sgress454對此有何更新?我只是安裝了帆0.10.2和sails-mysql 0.10.4和mysql日誌顯示以下輸出:'(SELECT * FROM city AS city WHERE CountryCode =「ABW」ORDER BY city.id ASC LIMIT 30)UNION(SELECT * FROM ASC LIMIT 30)(...) – jaredfromsubway

+0

這是因爲你正在擊中默認限制爲30條記錄的藍圖路線。在這種情況下,你不能做簡單的連接,因爲查詢只返回30行,你真正想要的是最多900行(30個國家,每個都有30個城市)。因此,'UNION'比仍然爲每個國家進行單獨的查詢要好得多。如果您可以將其歸結爲單個查詢,那麼我們對查看它非常感興趣!有關更多信息,請參見[本文](http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/)問題。 – sgress454