Intereting Posts

Cake PHP присоединился к запросу, возвращенному как ассоциативный массив

ОК, вот моя таблица / модель: Модели связаны соответствующим образом.

структура таблицы

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

Проконсультировавшись с документами, я подготовил следующие параметры для моего запроса в модели клиента:

$findParameters = array( 'conditions' => array( 'Account.client_id' => $clientId, 'Holding.holding_date = LAST_DAY(Holding.holding_date)', //gets month-end dates only 'MONTH(Holding.holding_date)' => array(3,6,9,12) //Use for quarter-end dates ), 'fields' => array( 'Holding.holding_date', 'SUM(Holding.value) AS portfolio_value' ), 'group' => array('Holding.holding_date') ); 

Когда я запускаю запрос, выполняя

 $holdings = $this->Account->Holding->find( 'all', $findParameters ); 

Я получаю такой результат:

 Array ( [0] => Array ( [Holding] => Array ( [holding_date] => 2009-12-31 ) [0] => Array ( [portfolio_value] => 273239.07 ) ) [1] => Array ( [Holding] => Array ( [holding_date] => 2010-03-31 ) [0] => Array ( [portfolio_value] => 276625.28 ) ) ... 

Это здорово, но я хочу получить результат в таком массиве:

 Array ( [2009-12-31] => 273239.07 [2010-03-31] => 276625.28 ... ) 

Поэтому я стараюсь:

 $holdings = $this->Account->Holding->find( 'list', $findParameters ) 

Но я получаю сообщение об ошибке:

 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Account.client_id' in 'where clause' 

Запрос выглядит так, как будто он больше не выполняет объединения в таблицах. Любая идея, почему, учитывая это, отлично работает, если я использую all вместо list ? И как получить желаемый результат?


EDIT: Я получил результат, используя hash класс Cake, но задавался вопросом, является ли прямой запрос более эффективным и эффективным.

Мой метод:

  $holdings = $this->Account->Holding->find( 'all', $findParameters ); $values = Hash::extract($result, '{n}.0.portfolio_value'); $dates = Hash::extract($result, '{n}.Holding.holding_date'); $result = array_combine($dates, $values); return $result; 

Общее замечание

ORM CakePHP отлично подходит для поиска запросов (включая group by sort …). Когда дело доходит до более сложных материалов, вам нужно либо обработать данные, полученные на PHP, либо сделать простой SQL-запрос .

Об ассоциативных массивах

Model::find('all') или Model::find('first') всегда возвращают ассоциативный массив. Другие методы поиска возвратят различные типы массивов, но вы не сможете получить результат, который вы ищете, используя функции «Модель».

О полях, которые не добавляются в правильный подмассив

Чтобы ваше поле правильно отображалось вместе, когда у вас есть SUM() , AVG() или COUNT() вы можете прочитать здесь о virtual fields в SQL-запросах

Как извлекать / форматировать массивы в CakePHP

Самый простой способ – использовать класс Hash для извлечения и форматирования данных так, как вы хотите.

Используя Hash::combine вы можете добиться того, что вы ищете:

 $result = Hash::combine($holdings, '{n}.Holding.holding_date', '{n}.0.portfolio_value'); 

Пожалуйста попробуйте

 $findParameters = array( 'conditions' => array( 'Account.client_id' => $clientId, 'Holding.holding_date = LAST_DAY(Holding.holding_date)', //gets month-end dates only 'MONTH(Holding.holding_date)' => array(3,6,9,12) //Use for quarter-end dates ), 'fields' => array( 'Holding.holding_date', 'SUM(Holding.value) AS portfolio_value' ), 'group' => array('Holding.holding_date'), 'contain' => array('Account), );