5

非常に大きなクエリを実行する必要がある状況で、25〜30の結合を使用して、定期的なレポートを生成します。

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

モデル内の私のコードは次のようになります。

$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"
        )
)
4

3 に答える 3

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'
)

二重下線__は重要です!サブクエリのトピックもご覧ください。

于 2012-10-11T13:37:54.523 に答える
1

クエリをビューとして記述し、 「テーブル」がそのビューであるCakeモデルを作成します。

これができない場合は、結果を繰り返し処理して、希望の形式に変換する必要があります。ここでは、 Setクラスが非常に役立つと思います。

于 2012-10-11T06:27:44.173 に答える
1

CakeフレームワークのMySql.phpファイルをもう少し掘り下げると、すべてのマッピング/関連付けを行うresultSetメソッドがあります。

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)

したがって、列名にvirtualfieldseparatorが含まれている場合(デフォルトでは__)、その列はテーブル名ではなくインデックス0に関連付けられます。

于 2012-10-11T15:20:27.243 に答える