2012-10-11 1 views
5

非常に大きなクエリを実行する必要がある状況で、定期的なレポートを生成するために25〜30個の結合があります。cakephpクエリから一次元配列として結果を得る

これらのクエリは既に作成されていますが、私はそれらを再利用してケーキモデルのクエリメソッドを使用したいだけです。

は、モデルの私のコードは次のようであると言う:私は戻って取得

$this->query(
    'select emp.name,mngr.designation 
    from employee emp,manager mngr 
    where manager.emp_id=emp.id' 
) 

結果は同様である:

Array 
(
    [0] => Array 
     (
      [emp] => Array 
      (
       [name] => "Tom" 
      ) 
      [mngr] => Array 
      (
       [designation] => "Developer" 
      ) 
     ) 
    [1] => Array 
     (
      [emp] => Array 
      (
       [name] => "Thomas" 
      ) 
      [mngr] => Array 
      (
       [designation] => "Developer Manager" 
      ) 
     ) 
) 

は私がCakePHPの結果セット

から次のプレーンバニラ構造を得ることができる方法はあります
Array 
(
    [0] => Array 
     (
      [0]=>"Tom" 
      [1]=>"Developer" 
     ) 
    [1] => Array 
     (
      [0]=>"Thomas" 
      [1]=>"Developer Manager" 
     ) 
) 

または列レベルでの関連付けで、テーブルレベルでの関連付けはありません

Array 
(
    [0] => Array 
     (
      [name]=>"Tom" 
      [designation]=>"Developer" 
     ) 
    [1] => Array 
     (
      [name]=>"Thomas" 
      [designation]=>"Developer Manager" 
     ) 
) 
+0

あなたは3つの異なるCakeのバージョンをタグ付けしましたか?どちらを実際に使用していますか? –

+0

うんベン、私は実際にバージョン2.1.2を使用しています –

答えて

1

あなたは別名をこのように使って、似たような得ることができます:

$this->query(
    'select emp.name AS emp__name, mngr.designation AS mngr__destination 
    from employee emp,manager mngr 
    where manager.emp_id=emp.id' 
) 

ダブルアンダースコア__が重要です!また、Sub-queriesトピックを見てください。

+0

おかげで、私は同じことを知りました。それはvirtualFieldSeparatorでもっとやることです、別の答えと同じように説明します –

1

Viewとしてクエリを作成し、 'table'がそのビューであるCakeモデルを作成します。

これを行うことができない場合は、結果を反復して、必要な形式に変換する必要があります。私はSet classがここで非常に役に立ちますと思っています。

+0

おかげでベン、私は自分自身をループする必要があるように思われる、またはあなたが結果を再構築するためにクラスを設定することを示唆しただけで、そのレポートと巨大なデータセットケーキはすでにそれを作成している間、同様のものをやっているので、余分なコストになります。 –

1

CakeフレームワークのMySql.phpファイルにもう少し詳しく調べると、すべてのマッピング/関連付けを行うresultSetメソッドがあります。列名は、デフォルトで__その列はインデックス0の代わりに、テーブル名に関連付けられてしまいますですvirtualfieldseparatorが含まれている場合は注意する

public function resultSet($results) { 
    $this->map = array(); 
    $numFields = $results->columnCount(); 
    $index = 0; 

    while ($numFields-- > 0) { 
     $column = $results->getColumnMeta($index); 
     if (empty($column['native_type'])) { 
      $type = ($column['len'] == 1) ? 'boolean' : 'string'; 
     } else { 
      $type = $column['native_type']; 
     } 
     if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) { 
      $this->map[$index++] = array($column['table'], $column['name'], $type); 
     } else { 
      $this->map[$index++] = array(0, $column['name'], $type); 
     } 
    } 
} 

ここの文は

if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) 

そうです。

関連する問題