2012-07-27 52 views
1

我有一個簡單的CFC類來處理Product - Product.cfc上的CRUD。如何在CRUD OOP CFC中重新使用查詢?

我在擴展該類以允許基於應用程序的其他屬性 - 例如CartProduct.cfc擴展Product.cfc以允許包含數量屬性。

在Base Product.cfc類,我首先通過在一個ID,並使用該ID在我read()方法來從數據庫中檢索數據:

<cffunction name="read" returntype="Query"> 
    <cfquery name="qData" datasource="mydb"> 
     SELECT description 
     FROM  mySKUTable 
     WHERE  id = '#VARIABLES.Sku#' 
    </cfquery> 

    <cfreturn qData /> 
</cffunction> 

<cffunction name="setSku" returntype="Product"> 
    <cfargument name="Sku" type="String" required="true" /> 
    <cfscript> 
     var qData = QueryNew(""); 

     VARIABLES.Sku = ARGUMENTS.Sku; 

     qData = read(); 

     VARIABLES.description = qData.description; 
    </cfscript> 
</cffunction> 

我想在此延伸CartProduct.cfc檢索和使用read()方法從不同的表中設置的數量:

<cffunction name="read" returntype="Query"> 
    <cfquery name="qData" datasource="mydb"> 
     SELECT quantity 
     FROM  myCartTable 
     WHERE  id = '#VARIABLES.Sku#' 
    </cfquery> 

    <cfreturn qData /> 
</cffunction> 

<cffunction name="setSku" returntype="Product"> 
    <cfargument name="Sku" type="String" required="true" /> 
    <cfscript> 
     var qData = QueryNew(""); 

     THIS = SUPER.setSku(Sku); 

     qData = read(); 

     VARIABLES.quantity = qData.quantity; 
    </cfscript> 
</cffunction> 

當我做到這一點,只有延伸閱讀()被調用。這很好,這是按設計的。但是,我正在尋找一種方法來調用read()方法,因此我可以先設置基類中的屬性,然後在擴展類中設置屬性。

對此有何看法?

p.s.我知道我沒有使用CFQUERYPARAM或驗證我的輸入等等。爲了保持這個簡單,我留下了那些垃圾,所以請不要給我這些建議。

回答

1

好了,這裏就是我想出了:

而不是從read()方法返回的查詢,我查詢行轉換成一個結構和返回的結構。這樣,我可以從read()中調用SUPER.read(),然後將父Struct中的鍵和值複製到每個級別的新Struct中。這是更多的代碼,但它完成了工作。

<cffunction name="read" returntype="Struct" output="false"> 
    <cfscript> 
     var _qData = QueryNew(""); 
     var _properties = SUPER.read(); 
    </cfscript> 

    <cfquery> 
    ... 
    </cfquery> 

    <cfscript> 
     StructAppend(
      _properties, 
      REQUEST.UDFLib.Query.queryRowToStruct(_qData) 
      ); 

     return _properties; 
    </cfscript> 
</cffunction> 
0

您可以使用「超級」作用域來引用擴展組件。因此,要從CartProduct.cfc中調用Product.cfc的「讀取」方法,請調用Super.read()。

+0

是的,那正是我想要做的,但是如果不先將它們轉換爲另一種類型,就不能輕鬆地組合多個查詢對象,就像我在下面的答案中使用Structs所做的那樣。 – 2012-07-30 19:21:43