Web アプリケーションの開発では、さまざまなビジネス ロジックや効果を実現するために、ランダム データをクエリすることが必要になることがよくあります。 thinkphp フレームワークでは、さまざまなテクノロジとメソッドを使用して、データをランダムにクエリする機能を実装できます。
一般的な方法は、mysql のランダム関数 (rand() 関数) を使用することです。この関数は、開始点と終了点を指定することにより、一定の範囲内のランダムなデータを問い合わせることができます。たとえば、$tb_test テーブル内の ID が 10 ~ 100 のランダム データをクエリするには、次のコードを使用できます。
<?php use think\Db; $data = Db::name('test')->where('id', 'between', [10, 100])->orderRaw('rand()')->limit(10)->select();
その中で、where 条件は ID の範囲を指定し、orderRaw 関数は ID の範囲を指定します。並べ替えの場合、limit 関数はクエリするデータ項目の数を指定します。この方法の欠点は効率が低いことであり、テーブル内のデータ量が多い場合、クエリ速度が大幅に遅くなります。
もう 1 つの方法は、PHP の rand 関数を使用して、ビジネス ロジックと関数を記述してデータをランダムにクエリする機能を実装することです。考え方は次のとおりです。
まず、クエリ テーブルからレコードの総数を取得し、クエリに必要なレコードの数に基づいて必要なレコードの ID 番号を計算します。
次に、ID 番号に基づいてデータをクエリし、クエリされたデータがランダムであることを確認します。このうち、rand関数のランダム性を制御するシード値は、クエリ結果のランダム性を保証するために使用できます。さらに、コードの実装プロセス中は、頻繁なデータベース クエリを避けるために必ずキャッシュ テクノロジを使用してください。
具体的なコード実装は次のとおりです。
<?php use think\Cache; use think\Db; //获取数据表总记录数 $count = Db::name('test')->count(); //指定查询记录数 $num = 10; //生成随机数种子 $seed = rand(0, $count - 1); //生成id数组 $id_arr = range(1, $count); shuffle($id_arr); $id_arr = array_slice($id_arr, 0, $num); //查询数据 $data = Cache::remember('random_data', function() use ($id_arr) { $data = Db::name('test')->where('id', 'in', $id_arr)->select(); return $data; }, 60);
その中で、 range 関数は指定範囲の配列を生成するために使用され、 shuffle 関数は配列をランダムにスクランブルするために使用され、 array_slice 関数は、配列の指定された長さをインターセプトするために使用されます。 Cache クラスは、頻繁なデータベース クエリを回避するためにデータ キャッシュを実装するために使用されます。キャッシュ時間とキャッシュ戦略は、実際のビジネス ニーズに応じて調整できます。
上記 2 つの方法はどちらもデータをランダムにクエリする機能を実現できますが、どちらの技術を使用するかは実際のビジネス シナリオとニーズによって異なります。 Web アプリケーションを開発する場合、機能を最適化し、ユーザー エクスペリエンスを向上させるために、パフォーマンス、効率、セキュリティ、その他の考慮事項に基づいて適切なテクノロジと手法を選択する必要があります。
以上がthinkphp で複数のデータをランダムにクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。