1

行を削除したり、レコードセットやコレクションをフィルタリングしたりする方法があるかどうか知りたいのですが。

たとえば、2つのテーブルがある場合:1つは質問用、もう1つは回答の選択肢用です。質問はさまざまな形式に属しています。質問1〜10はフォームaに属し、11〜20はフォームbに属します。前の質問の回答に応じて、特定の質問が表示される場合と表示されない場合があり、特定の回答が後で表示される場合と表示されない場合があります。常にデータベースにアクセスするのではなく、各フォームに属するレコードセットまたは質問のコレクションをメモリにキャッシュし、セッションごとにメモリ内の質問のセットを除外したいと思います。

このように、各ユーザーは、[次へ]をクリックするたびにではなく、セッションの開始時に1回だけデータベースにアクセスします。

4

3 に答える 3

2

モデルによって使用されるCollectionオブジェクトは拡張され、そこからlithium\util\Collection既存のコレクションをフィルタリングし、ユーザーが提供したクロージャーに基づいて新しいコレクションを返すためのメソッドを提供します。

$newQuestions = $oldQuestions->find(function($question) {
    if (your new criteria) { 
        return true;
    }
    return false;
});

適用する基準を決定し、クロージャーでフィルタリングを実行するだけです。実行するとCollection、一致したレコードのみを含む新しいオブジェクトが作成されます。

于 2012-02-09T15:56:19.570 に答える
2

データベースからRecordsetまたはCollectionを取得したら、いくつかのフィルターを実行できます。詳細については、を参照しlithium\util\Collectionてください。

例は

$questions = Questions::all();
$form_questions = $questions->find(function($question) {
  if($query->form == 'b') {
    return true;
  }
  return false;
}), true);

これらの質問がページリクエスト間で持続するように処理するには、を調べてくださいlithium\storage\Session

于 2012-02-09T16:04:26.367 に答える
1

本当に素晴らしいトラフィックがない限り、単純な「ページごとに1回」のデータベース呼び出しがサーバーに大きな負担をかける可能性は低いですが、これを実行したい場合は、この情報をキャッシュするのが最も簡単な方法です。ユーザーがログインすると、PHP$_SESSIONスーパーグローバルで。ファイルシステムストレージを使用するようにPHPを設定したとすると(データベースセッションストレージを使用しても、パフォーマンスにわずかな影響しかありません)、質問は超高速で保存されます。 -特定のユーザーごとに一意になるように事前に作成されているファイルにアクセスします。スクリプトがロードされるとすぐに、セッションファイルが自動的にメモリに読み込まれ、そこから任意の情報にアクセスできます。

例:

質問テーブルに列がquestion_numberありquestion_text、回答テーブルに列がquestion_numberあり、answer_text

<?php
//on login:
//first get the answer array, so we can use it in the logic below:
$query = mysql_query('SELECT * FROM `questions` WHERE [criteria]',[connection identifier]) or die(mysql_error());
if (!mysql_num_rows($query)){
   die("No questions!");
}
$answer_array = array();
//create a keyed array that you can access by question number
while($row=mysql_fetch_array($query)){
   $answer_array[$row['question_number']] = $row['answer_text'];
}


//now get the questions and put everything into the session variable 
$query = mysql_query('SELECT * FROM `questions` WHERE [criteria]',[connection identifier]) or die(mysql_error());
if (!mysql_num_rows($query)){
   die("No questions!");
}
//loop through the results and generate session arrays we can work with later
while($row = mysql_fetch_array($query)){
   //assign the question to the correct form:
   if ($row['question_number']<=10){
      $session_key = 'form_a';
   } elseif($row['question_number']<=20){
      $session_key = 'form_b';
   } elseif($row['question_number']<=30){
      $session_key = 'form_c';
   } else {
      $session_key = 'form_d';
   }

   //if the session variable does exist yet, create it:
   if (!isset($_SESSION[$session_key])){
      $_SESSION[$session_key] = array();
   }
   //get the existing answer if it exists, otherwise leave the answer blank:
   $my_answer = "";
   if(isset($answer_array[$row['question_number']])){
      $my_answer = $answer_array[$row['question_number']];
   }
   //add this question array as a child array element in the session array, keyed by the question number
   $_SESSION[$session_key][$row['question_number']] = array(
      'question' => $row,
      'answer'   => $my_answer
   );
}

たとえば、フォームBを読み込んでいる場合は、セッション配列からフォームBを読み取り、$_SESSION['form_b']前の質問への回答に基づいて、必要な論理スイッチを実行できます。

$html = "";
foreach($_SESSION['form_b'] as $question_number => $data){
  //perform any logic, for instance, if question 2 from form a is equal to '5', don't show question 3 on form B:
  switch($question_number){
      case '3': if ($_SESSION['form_a']['2']['answer']=='5'){ continue 2; }; break;
  }
  //add the question to the form, and populate the answer if they already answered it earlier:
  $html .= "<label>".$data['question']."<input type='text' value=\"".$data['answer']."\" name='question_".$question_number."' /></label>";
}

次に、各フォームを送信するときに、mysqlanswersテーブルを更新するだけでなく、_SESSION配列も更新する必要があります。たとえば、POSTを介してフォームBを送信する場合:

$form = 'form_b';
foreach($_POST as $key=>$value){
    if (substr($key,0,strlen('question_')!='question_'){
        continue;                       
    }
    $number = str_replace('question_','',$key); //this will give us the question number
    $saved = add_answer($number,$value); //call the function to insert the new answer into the database (this is a dummy function, and please make sure to escape your variables
    if ($saved){//assuming it saved:
        $_SESSION[$form ][$number]['answer']=$value; //now we've updated the session array as well.
    }
}
于 2012-02-09T03:02:42.997 に答える