などの実績を残します
1000ポイントを獲得
ログイン20回
24 時間以内に 2 つのタスクを完了する
等
これをプログラムする最良の方法は何ですか?(その背後にあるロジックのように。ページの読み込みごとに可能なすべての成果をチェックするのはリソースの無駄です)
などの実績を残します
1000ポイントを獲得
ログイン20回
24 時間以内に 2 つのタスクを完了する
等
これをプログラムする最良の方法は何ですか?(その背後にあるロジックのように。ページの読み込みごとに可能なすべての成果をチェックするのはリソースの無駄です)
これはかなり自由回答形式の質問です。1 つのアプローチは、ユーザーが既に達成したことの進行状況をデータベース テーブル (各達成ごとに 1 つの列) に格納し、進行状況の値を上げて、進行状況が発生するたびに保存することです。各実績の魔法の値 (null、100 万など) は、目標に到達したときに設定できます。その後、各ユーザーのエントリのどの列に魔法の値があるかを確認するだけで済みます。
進捗を保存してアクセスごとに達成状況を計算するだけでもいいのですが、おっしゃる時間制限のあるタスクなどでは問題があり、何らかの理由で目標を変更して達成を失うとイライラする可能性があると思います。以前獲得していました。
おそらくより正しいアプローチは、各行が 1 つの成果と目標を詳述する静的な「成果」テーブルを作成することです。次に、各ユーザーが取り組んでいるさまざまな成果ごとに行を持つ個別の「進行状況」テーブルを作成します。これを実装するのは手間がかかりますが、進捗テーブルの列名に目標をハードコーディングするよりも、後で目標を簡単に追加/削除/変更できるようになります。これが後であなたに与える価値を過小評価すべきではないと思います。このように、進捗テーブルには各ユーザー/実績の組み合わせに対して複数の列を含めることができます。これにより、達成に到達した時間などを保存でき、次のような実績のリストを非常に簡単に取得できます。
SELECT achievement_id
FROM progress
WHERE user_id = $user
AND achievment_time IS NOT NULL
各ページにアチーブメントを表示したい場合は、各ページの読み込みごとに何かをチェックする必要がありますが、これらの方法のいずれかで進捗を記録すると、最初の原則に戻ってログイン数を計算することにはなりません。毎回完了したタスクの数など-DBからのSELECTだけです。これはあなたが意味していると思います。
ログイン数などの進捗状況の記録は簡単ですが (アクションを実行するたびにカウンターをインクリメントするだけです)、時間制限のある成果の進捗状況を監視するためのロジックについては、もう少し慎重に考える必要があります。ここでは、別のテーブルでアクションが実行されたときのタイムスタンプを追跡する必要があります (もちろん、すでにこれを行っている可能性があります)。新しいタイムスタンプが作成されるたびに、前の期間のタイムスタンプをカウントして、成果が達成されました。