Форматировать MySQL Select в ассоциативный массив в CakePHP


Мне нравится, как CakePHP автоматически просматривает результаты запросов MySQL и форматирует их в красивую карту для вас.

Вот пример запроса, который я использую:

# Inside some model
return $this->query("

  SELECT 
    Profile.id,
    SUM( IF( HOUR(Log.event_one) > 3, 1, 0 ) ) as EventOne

  FROM profiles Profile
  JOIN logs Log ON Log.id = Profile.log_id

  WHERE Profile.id = {$pUserId}
");

CakePHP вернет в результате карту, подобную следующей:

array
  0
    array
      'Profile'
          array
            'id' => 23
      '0'
          array
            'EventOne' => 108
  1
    array
      'Profile'
          array
            'id' => 23
      '0'
          array
            'EventOne' => 42
  2
    ...

Я пытаюсь добиться, чтобы результат был примерно таким:

array
  'Profile'
      array
        'id' => 23

  'Events'
  #   ^   I want to be able to specify this key
      array
        'EventOne' => 108

Есть идеи?

Author: rodrigo-silveira, 2012-01-13

1 answers

Вы не можете сделать это напрямую

Ключи массива верхнего уровня получены из имени таблицы, к которой, по словам mysql, относится поле - в вашем случае это вычисляемое поле и, следовательно (согласно mysql), не принадлежит ни одной таблице - следовательно, ключ массива 0.

Последующая обработка

Что вы можете сделать, однако, это обработать результат так, чтобы он был в нужном вам формате:

public function getStuff() {
    // The query call in the question can very easily be a normal find call
    $return = $this->query("don't use query unless you have no choice");

    foreach($return as &$row) {
        $row['Events'] = $row[0];
        unset($row[0]);
    }

    return $return;
}
 0
Author: AD7six, 2013-01-15 11:43:17