ColdFusion to PHP: Могу ли я сделать запросы так же легко?

Я работаю в большой компании, которая имеет множество веб-приложений 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>

Для меня, хотя существует множество логических путей, этот код:

  • очень легко читать,
  • просто понять и
  • легко отлаживать синтаксически

Несколько других функций, которые имеет этот динамически построенный запрос:

  • встроенная логика if / else и циклы — для всех предложений SQL (Select, объединения, куда, order by, group и т. д.)
  • в соответствии, переменная привязка данных: может быть 0 связанных параметров или 50+; мы не будем знать или заботиться до времени выполнения
  • родная привязка данных для значений списка (… где uid в (‘12345’, ‘98765’) …) (в Coldfusion, <cfqueryparam ... list="true">)

Я не думаю, что мне нужен урок о том, как ты Можно построить запрос PHP; Я знаю, что вы можете сидеть там и довольно утомительно соединять небольшие нити вместе, чтобы выполнить нечто подобное.

Я хотел бы спросить:

  1. Есть ли способ построить запросы в PHP, аналогичные тому, как они создаются в ColdFusion, с помощью <cfquery></cfquery> теги как границы буфера, с чистой логикой и синтаксисом между ними, и
  2. Независимо от ответа на вопрос № 1, есть ли в PHP простой способ выполнить привязку данных, когда число связанных параметров варьируется, неизвестно до времени выполнения, и число которых может быть определено с помощью многопараметрической логики? Сделать это в приведенном выше примере тривиально — вы просто используете <cfqueryparam> где и когда вам это нужно.

Поскольку у нас нет времени или ресурсов для перестройки всего приложения, я не собираюсь, например, отображать все наши объекты с помощью ORM. Я действительно просто хочу построить запросы.

Заранее спасибо.

0

Решение

Самое близкое, что вы можете получить, это использовать построитель запросов в 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.

Это займет некоторое время, чтобы привыкнуть к нему, но я считаю, что это более читабельно, чем упомянутый ад объединения строк.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]