Можем ли мы добавить DateTime в массив с помощью функции ArrayAppend () ColdFusion? - PullRequest
0 голосов
/ 06 ноября 2018

ОШИБКА: невозможно привести тип объекта [DateTime] к значению типа [Массив]

<cfset Seniority=ArrayNew(1)>
  <CFLOOP QUERY="all_employees">
      <cfif isNull(all_employee.TimeInPositionDate) >
          <cfset ArrayAppend(Seniority,all_employee.hiredate)>
      <cfelse>
          <cfset ArrayAppend(Seniority,all_employee.TimeInPositionDate)>
      </cfif>
  </CFLOOP>

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Ваша проблема связана с поиском переменной в CFML. Пока вы находитесь внутри цикла запроса, ColdFusion будет извлекать данные из области запроса до области действия ваших переменных. Из-за того, что в вашем запросе есть столбец, также называемый Seniority, ваш код выглядит так же, как ArrayAppend(all_employees.Seniority,all_employees.hiredate);

Изменение имени вашего массива решит проблему.

 <cfset all_employees = queryNew(
    "Id,TimeInPositionDate,Hiredate,Seniority",
    "Integer,Timestamp,Timestamp,Timestamp",
    [
        {"Id":1,"HireDate":Now(),"Seniority":Now()},
        {"Id":2,"HireDate":Now(),"TimeInPositionDate":Now(),"Seniority":Now()}
    ]
)>

<cfset arrSeniority=ArrayNew(1)>

<CFLOOP QUERY="all_employees">
    <cfif isNull(all_employees.TimeInPositionDate) >
        <cfset ArrayAppend(arrSeniority,all_employees.hiredate)>
    <cfelse>
        <cfset ArrayAppend(arrSeniority,all_employees.TimeInPositionDate)>
    </cfif>
</CFLOOP>
<cfdump var="#arrSeniority#"/>
0 голосов
/ 06 ноября 2018

Я все еще думаю, что в CFScript циклы намного проще (не говоря уже о том, что он просто выглядит чище для меня. В любом случае, я могу свести это к одной строке кода (помимо создания массива) и зацикливание кода).

Сначала я настроил свой поддельный объект запроса:

all_employees = QueryNew(
    "id, TimeInPositionDate, hiredate" ,
    "integer, date, date" ,
    [
        {
          id:1 ,
          TimeInPositionDate: "2018-01-01" , 
          hiredate: "2017-01-01"
        } , 
        {
          id:2 ,
          // TimeInPositionDate: Not defined, so NULL
          hiredate: "2017-02-01"

        } , 
        {
          id:3 ,
          TimeInPositionDate: "2018-03-01"
          //hiredate: Not defined, so NULL
         } ,
        {
          id:4 
          //TimeInPositionDate: Not defined, so NULL
          //hiredate: Not defined, so NULL
         } 
    ]
);

Я создал 3 строки. 1 полная строка, 1 с TimeInPositionDate, 1 с hiredate и 1 с ни тем, ни другим. ColdFusion всегда был немного странным с тем, как он обрабатывает null, и он не всегда хорошо сочетается с запросом SQL. В нашем поддельном запросе мы просто не определяем строки, которыми мы хотим быть null.

Далее я создаю свой массив:

Seniority = [] ;

Нам не нужно использовать ArrayNew() для создания массива. Мы можем просто использовать неявную запись, чтобы быть намного короче.

Далее мы используем цикл for/in вокруг нашего запроса, чтобы добавить данные строки в наш новый массив.

for (r in all_employees) {
    Seniority.append( len(r.TimeInPositionDate) ? r.TimeInPositionDate : r.hiredate ) ;
}

Здесь мы используем функцию-член append() для добавления в наш массив Seniority. Мы также используем троичную операцию, чтобы выбрать, какое значение мы хотим добавить. В основном это говорит о том, что если для этой строки есть длина до TimeInPositionDate, то мы используем первое условие (TimeInPositionDate), в противном случае мы используем hiredate.

Я думаю об использовании оператора Элвиса ...

Seniority2.append( q.TimeInPositionDate ?: q.hiredate ) ;

..., но поскольку запрос скорее всего возвращает q.TimeInPositionDate="" вместо действительного значения null, то первое значение технически определено и выбрано. Это будет работать для истинного null, но пустая строка не является null.

Возможно, вы могли бы также использовать each() или какую-либо другую циклическую функцию для итерации по вашему объекту запроса, но я обнаружил, что циклы for/in обычно бывают быстрее в подобных случаях. Вам придется проверить.

Вы можете играть с полной вещью по адресу:

https://cffiddle.org/app/file?filepath=de107907-234c-4df8-9386-02a288e53313/fdf21791-6cc4-4c55-b923-ad7726efa8ee/b3b6b906-8e3a-4f6b-9ec8-65845efc40f1.cfm

РЕДАКТИРОВАТЬ : NULL s может быть очень весело. Если мы вернемся к какой-то Java, мы сможем получить фактическое значение null из запроса, а не преобразованную cfquery пустую строку, и показать, что Элвис все еще находится в здании.

all_employees.getDate("TimeInPositionDate") ?: all_employees.getDate("hiredate") ) ;

Поскольку Java getDate() в запросе получит фактическое значение и может обработать null, это правильно выбирает 2-й вариант для строк, где TimeInPositionDate равно null. Тем не менее, хотя я ценю интеграцию Java и ColdFusion, я не рекомендую ее в этом случае. Он смешивает Java с CF и не нуждается в демонстрации.

...