我在一家拥有大量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>
对我来说,即使有各种逻辑路径,该代码也是:
此动态构建的查询具有以下几个其他功能:
<cfqueryparam ... list="true">
)< / LI>
我不认为我需要一个关于你如何构建PHP查询的课程;我知道你可以坐在那里,而且很繁琐地将小字符串连接在一起以完成类似的事情。
我想问的是:
<cfquery></cfquery>
标记作为缓冲区的边界,中间使用干净的逻辑和语法,以及<cfqueryparam>
。因为我们没有时间或资源来重新构建整个应用程序,所以我并不是要通过ORM映射所有对象。我真的只想构建查询。
提前致谢。
答案 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.
需要一些时间来习惯它,但我认为这比上面提到的字符串连接更具可读性。