如何在CRUD OOP CFC中重复使用查询?

时间:2012-07-27 20:42:33

标签: oop coldfusion cfc method-overriding

我有一个简单的CFC类来处理Product-Product.cfc上的CRUD。

我正在扩展类以允许基于应用程序的其他属性 - 例如CartProduct.cfc扩展Product.cfc以允许包含Quantity属性。

在Base Product.cfc类中,我首先传入一个ID,并使用read()方法中的ID从数据库中检索数据:

<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()。这很好,这是设计的。但是,我正在寻找一种方法来调用 BOTH read()方法,所以我可以先在基类中设置属性,然后在扩展类中设置Properties。

对此有何想法?

P.S。我知道我没有使用CFQUERYPARAM或验证我的输入等。为了保持这个简单,我留下了废话,所以请不要立即给我这些建议。

2 个答案:

答案 0 :(得分:1)

好的,这就是我想出的:

我没有从read()方法返回Query,而是将Query行转换为Struct并返回Struct。这样我就可以从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>

答案 1 :(得分:0)

您可以使用“超级”范围来引用扩展组件。因此,要从CartProduct.cfc中调用Product.cfc的“read”方法,请调用Super.read()。