Я работаю в большой компании, которая имеет множество веб-приложений ColdFusion. Они требуют от всех этих приложений перехода на новые платформы / языки.
Одно из этих приложений довольно большое и сложное. Его целью является PHP из-за знакомства с ресурсами и поддержки.
Одна из приятных вещей, которые мне нравились в ColdFusion, была возможность сортировать SQL-запрос в произвольной форме между <cfquery>
теги. Мне интересно, есть ли способ сделать это в 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">
)Я не думаю, что мне нужен урок о том, как ты Можно построить запрос PHP; Я знаю, что вы можете сидеть там и довольно утомительно соединять небольшие нити вместе, чтобы выполнить нечто подобное.
Я хотел бы спросить:
<cfquery></cfquery>
теги как границы буфера, с чистой логикой и синтаксисом между ними, и<cfqueryparam>
где и когда вам это нужно.Поскольку у нас нет времени или ресурсов для перестройки всего приложения, я не собираюсь, например, отображать все наши объекты с помощью ORM. Я действительно просто хочу построить запросы.
Заранее спасибо.
Самое близкое, что вы можете получить, это использовать построитель запросов в 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.
Это займет некоторое время, чтобы привыкнуть к нему, но я считаю, что это более читабельно, чем упомянутый ад объединения строк.
Других решений пока нет …