ОК, вот моя таблица / модель: Модели связаны соответствующим образом.
Я пытаюсь запросить сумму удерживающего значения для данного идентификатора клиента, с датой заданной суммы значения в качестве ключа массива.
Проконсультировавшись с документами, я подготовил следующие параметры для моего запроса в модели клиента:
$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-запросах
Самый простой способ – использовать класс 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), );