ColdFusion to PHP:我可以轻松地进行查询吗?

时间:2017-11-02 12:59:41

标签: php sql coldfusion cfquery cfqueryparam

我在一家拥有大量ColdFusion网络应用程序的大公司工作。他们要求所有这些应用程序都转换为新的平台/语言。

其中一个应用程序非常庞大且复杂。由于资源的熟悉和支持,它的目标是PHP。

我喜欢ColdFusion的一个好处是能够分类自由形式的#34; <cfquery>标记之间的SQL查询。我想知道在PHP中是否有办法做到这一点。

这是我可能嵌入在ColdFusion组件(CFC)中的查询示例。查询的作用与cfquery标记之间的查询的所有部分如何有条件地构建一样重要:

<cfquery>
    select nametable.uid, firstname, lastname

    <cfif isdefined('alldata')>
        ,phone
        ,email
    </cfif>

    from
        nametable

    <cfif isdefined('alldata')>
        inner join contactdata
        on nametable.uid=contactdata.uid
    </cfif>

    where 1=1

    <cfif isdefined('firstname')>
        and firstname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#firstname#">
    </cfif>

    <cfif isdefined('lastname')>
        and firstname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#lastname#">
    </cfif>

    <cfif isdefined('uidlist')>
        and nametable.uid in <cfqueryparam cfsqltype="cf_sql_varchar" value="#uidlist#" list="true">
    </cfif>

    <cfif searchByDate>
        and cast(datafield as date)
    <cfelse>
        and datafield
    </cfif>

    between
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#attrValue1#">
    and
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#attrValue2#">

    <cfif isdefined("attrVals")>
        <cfloop from="1" to="#attrVals.length()#" index="i">
            and dbo.getPersonAttr(nametable.uid,'#attrvals[i].cd()#') = 
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#attrvals[i].val()#">
        </cfloop>
    </cfif>

    order by

    <cfif orderby eq "uid">nametable.uid<cfelse>lastname</cfif>

</cfquery>

对我来说,即使有各种逻辑路径,该代码也是:

  • 非常容易阅读,
  • 简单易懂,
  • 易于语法调试

此动态构建的查询具有以下几个其他功能:

  • 内联if / else逻辑和循环 - 跨所有SQL子句(选择,连接,where,order by,group等)
  • 内联,变量数据绑定:可能有0个绑定参数,或50+;我们直到运行时才知道或关心
  • 列表值的原生数据绑定(...其中uid in(&#39; 12345&#39;,&#39; 98765&#39;)...)(在coldfusion中,<cfqueryparam ... list="true">)< / LI>

我不认为我需要一个关于你如何构建PHP查询的课程;我知道你可以坐在那里,而且很繁琐地将小字符串连接在一起以完成类似的事情。

我想问的是:

  1. 有没有办法在PHP中构造查询,类似于他们在ColdFusion中构建的方式,使用<cfquery></cfquery>标记作为缓冲区的边界,中间使用干净的逻辑和语法,以及
  2. 无论#1的答案如何,当绑定参数的数量变化时,PHP是否有任何直接的方式来执行数据绑定,直到运行时才知道,并且可以使用多变量逻辑确定其数量?在上面的示例中执行此操作非常简单 - 您只需在需要的地方和时间使用<cfqueryparam>
  3. 因为我们没有时间或资源来重新构建整个应用程序,所以我并不是要通过ORM映射所有对象。我真的只想构建查询。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

您最接近的是使用a query builder in PHP。这看起来像这样(不完整的例子):

$columns = [ 'nametable.uid', 'firstname', 'lastname' ];

if isset($alldata) {
    array_push($columns, 'phone', 'email');
}

$builder = new GenericBuilder(); 

$query = $builder
    ->select()
    ->setTable('nametable')
    ->setColumns($columns)
;

if isset($firstname) {
    $query
        ->where()
        ->like('firstname', $firstname)
}

etc.

需要一些时间来习惯它,但我认为这比上面提到的字符串连接更具可读性。