探しているデザイン パターンはQuery Objectです。
データベース クエリを表すオブジェクト。
SQL は複雑な言語である可能性があり、多くの開発者は SQL に特に精通していません。さらに、クエリを作成するには、データベース スキーマがどのようなものかを知る必要があります。これは、パラメータ化されたメソッド内に SQL を隠す特殊なファインダ メソッドを作成することで回避できますが、アドホック クエリの作成が難しくなります。また、データベース スキーマが変更された場合に、SQL ステートメントが重複することにもつながります。
クエリ オブジェクトはインタープリター[Gang of Four]、つまり、SQL クエリを形成できるオブジェクトの構造です。このクエリは、テーブルや列ではなく、クラスやフィールドを参照して作成できます。このようにして、クエリを作成する人はデータベース スキーマとは無関係にクエリを作成でき、スキーマへの変更を 1 か所にローカライズできます。
クエリ オブジェクトを使用すると、パブリック API に SQL はまったくありません。Query オブジェクトの DB ベンダーの適切な SQL への変換は、内部で行われます。これには適切なアダプターの作成が含まれ、SQL データベースに限定されません。
代わりZend_Db_Select
に、SQL クエリを作成するための内部 DSL のようなものを使用することもできます。
ZF リファレンス ガイドの例:
$select = $db->select()
->from( ...specify table and columns... )
->where( ...specify search criteria... )
->order( ...specify sorting criteria... );
ただしZend_Db_Select
(および他の場所で言及されているPDO ) は、使用されている DB システムへのアクセスをある程度抽象化しますが、それでも SQL とテーブル構造を知る必要があります。クエリ オブジェクトとは異なり、このような DB 抽象化レイヤーを使用しても、移植性は保証されません。
これらのメソッドにどのような引数を入れるかによっては、クエリで特定の DB ベンダーの方言や関数を使用する場合など、移植性のないクエリになる可能性があります。
どちらを選択するかは、クエリによって異なります。標準クエリしかないことがわかっている場合は、クエリ オブジェクトを使用しないでください。データ ソースからの独立性を最大限に高めたい場合は、クエリ オブジェクトを使用します。