-1

Cakephp でアプリ プラグインを開発しています。そして、私は以下のデモの関数に行き詰まっています:

データベースには、データを含む「プラットフォーム」テーブルがあります(「1」=>「PC」、「2」=>「PS3」...)。

ゲームビューでは、私は持っています:

<? 
$platformes = array($igra['Igra']['pid']); /* gives me 1,2 */
$platforme = $this->requestAction(
    array(
        'plugin' => 'gamer', 
        'controller' => 'Igra', 
        'action' => 'getPlatformaIme'
    ),
    $platformes
); 
?>

コントローラーには、次のような関数があります。

function getPlatformaIme($pids) {
    $platforme =  explode(', ', $pids);
    $this->loadModel('Gamer.Platforme');

    foreach($platforme as $pid) {
        $this->Platforme->find('all', array(
            'conditions' => array('Platforme.id' => $pid)
        ));
        $name[] = $this->Platforme->field('name');
    }

    return implode(', ', $name);
}

これにより、PC、PS3 が表示されるはずですが、そうではありません。配列に1がなくても、PCになります。関数を修正するにはどうすればよいですか?

ヘルプのTnx、これが正しい方法です。

関数:

function getPlatformaIme($pids) {
    $platforme[] =  explode(',', $pids);
    $this->loadModel('Gamer.Platforme');

    foreach($platforme as $pid) {
    $names = $this->Platforme->find('list', array(
        'conditions' => array(
            'Platforme.id' => $pid
        )
    ));
    }

    return implode(', ', $names);
}

配列が (1,2) の場合、データベースから名前が返されます (PC、PS3) が返されます

4

1 に答える 1

0

ドキュメントを参照してください

検索はデータを返しますが、オブジェクトの状態は変更しません。検索の戻り値が使用されていない場合、理由やメリットがないため、SQL クエリが発行されます。

fieldは、条件が渡されることを期待する、現在のモデル ID のフィールド値を読み取ります。質問には条件がなく、モデルにIDが設定されていません-そのため、効果的に、ランダムレコードの名前フィールドが複数回返されます(おそらく同じ名前ですが、必ずしもそうではありません)。

ロジックを変更せずに修正されたコード:

問題のコードは次のように修正できます。

function getPlatformaIme($pids) {
    $platforme =  explode(', ', $pids);
    $this->loadModel('Gamer.Platforme');

    foreach($platforme as $pid) {
        $this->Platforme->id = $pid;
        $name[] = $this->Platforme->field('name');
    }

    return implode(', ', $name);
}

findをfield呼び出す必要もありません。これは次のような配列を返します。

array(
    'One',
    NULL, # <- if the pid doesn't exist
    'Three'
)

適切な検索を使用する

上記は、名前の配列を取得するための最も論理的な方法ではありません。find('list')は、この種の使用例のために存在します。

function getPlatformaIme($pids) {
    $platforme =  explode(', ', $pids);
    $this->loadModel('Gamer.Platforme');

    return $this->Platforme->find('list', array(
        'conditions' => array(
            'id' => $pids
        )
    ));
}

これは次のような配列を返します。

array(
    1 => 'One',
    3 => 'Three'
)

requestAction は必要ありません

リクエストを呼び出すリクエストアクションを使用してコントローラーを呼び出したり、モデルを呼び出したりする代わりに、モデルを直接呼び出すことができます。

// anywhere
$names = ClassRegistry::init('Gamer.Platforme')->find('list', array(
    'conditions' => array(
        'id' => $pids
     )
 ));

要素をキャッシュしないと、そのようなコードはビューに表示されません。むしろ beforeRender 関数で、そうしないと、保守不可能なアプリケーションを非常に簡単に作成できます。

ただし、質問のコードを考えると、それは1つの選択肢です。

于 2013-07-09T09:16:26.130 に答える