6

1つのテーブルを持つ非常に単純なアプリケーションがあり、各行には単語、その定義、および例が含まれています。

定義フィールドとサンプルフィールドはvarchars(5000)です。

すべてのページに、単語のリストを表示するサイドバーがあります。一定の単語数の後、次のエラーが発生し始めました。

Error: Allowed memory size of 33554432 bytes exhausted

要素で使用される変数を設定するコントローラーのコード:

$this->set('allWords', $this->Word->find('all', array('order' => array('Word.text ASC'))));

findメソッドは、定義と例を含むすべての行データを読み取ると思われますが、現時点では実際には必要ありません。これにより、エラーが発生します。

各行の定義と例の値ではなく、IDと単語を読み取る方法はありますか?

アップデート

Element内で、$ allWords配列をループして、各単語をリンクとともに出力します。

echo '<h3>Words ('.count($allWords).')</h3>';
echo $this->Html->link('Add new', array('controller' => 'words', 'action' => 'add'));
echo '<br/><br/>';

foreach($allWords as $thisWord)
{
    echo $this->Html->link($thisWord['Word']['text'], array('controller' => 'words', 'action' => 'edit', $thisWord['Word']['id']));

    if( ($thisWord['Word']['example'] == '') || ($thisWord['Word']['definition'] == '') )
    {
        echo '&nbsp;' . $this->Html->image('warning.png');
    }
    echo '<br \>';
}

foreachループの内部をコメントアウトしても、メモリエラーは発生しないようです。

この場合のSQL出力は次のとおりです。

SELECT `Word`.`id` FROM `idioms`.`words` AS `Word` WHERE 1 = 1 ORDER BY `Word`.`text` ASC`

339行が影響を受けました。

ありがとう!

4

2 に答える 2

3

関連付けられた配列でフィールドパラメータを渡します

'fields'=>array('Word.id','Word.word')

これを試すことができますか?

$this->set('allWords', $this->Word->find('all', array('order' => array('Word.text ASC'), 'fields'=>array('Word.id','Word.word') )));

詳細については、 http://book.cakephp.org/2.0/en/models/retriving-your-data.htmlを参照してください。

于 2012-11-21T01:52:56.190 に答える
2

find('list') を使用する

単一のフィールド値のリストを取得する簡単な方法は、find('list')を使用することです:

$values = $this->find('list', array(
    'fields' => array('id', 'text'),
    // ^ what to use for key and value of `$values`
    'order' => Word.text'
));

textが関連するモデルのdisplayFieldである場合、主キー フィールドと表示フィールドはデフォルト値であるため、フィールドを指定する必要はまったくありません。

$values = $this->find('list', array(
    'fields' => array('id', 'text'),
    'order' => Word.text'
));
于 2014-03-06T09:01:44.860 に答える