0

Books というクラスがあるとします。そのクラス内には、1 冊または複数冊の本のタイトル、価格、カテゴリを取得するメソッドがあります。だから、このようなもの:

public function fetchRows () {
  $sql = $con->prepare("SELECT Title, Price, Category FROM Books");
  $sql->execute();
  return $sql->fetchAll();
}

orderすべて問題ありませんが、別の行、結果、およびlimit返された行の量を取得したいとしましょう。そのためだけに別のメソッドを書くとうまくいきますが、そうすると途方もない量のメソッドが発生し、面倒で DRY ルールに準拠しません。引数を使用して準備ステートメントをカスタマイズできた場合、おそらく引数内にクエリ全体を記述することになり、それも堅実でクリーンではないようです。

私の質問は、エンド ユーザーが取得しようとしているものに適応するメソッド/クラスをどのように作成/構造化できるかということです。

申し訳ありませんが、これは実際には特定の問題に対する質問ではありません。私は自分の問題に関するいくつかの資料を読みましたが、そのパターンを頭に巻き込むのが難しいので、これを理解するのに役立つ説明や例を誰かが提供してくれることを願っています.

4

2 に答える 2

1

データベースの上にある ORM (Object Relational Mapper) の使用を検討したことがありますか? Doctrine 2 http://www.doctrine-project.orgを強くお勧めします。このようにして、データベース テーブルの行をオブジェクトとして扱うことができます。データベースとのやり取りはすべて抽象化されます (必要に応じて、SQL クエリを直接実行することもできます)。

ORM の概念に慣れていない場合は、Doctrine を使用して次のようなコードを記述できます。

$user = new User();
$user->username = 'test';
$user->email = 'test@example.com';
$entityManager->persist($user);
$entityManager->flush();

INSERT INTO user (username, email) VALUES ('test', 'test@example.com');SQL をまったく記述せずに実行しただけです。

同様に、ユーザーは次のように取得できます。

$user = $entityManager->getRepository('User')->findOneByUsername('test')

$user = $entityManager->getRepository('User')->findOneByEmail('test@example.com')

これらのファインダー メソッドは、ユーザー テーブルに存在するフィールドに基づいて自動的に生成されるため、コードを DRY に保つことができます。

于 2013-03-09T15:27:40.697 に答える
-1

エンドユーザーが取得しようとしているものに適応しますか?

あなたはここで不安定な土地に入っています。エンドユーザーに許可したいのは、データベースレイヤーへのアクセスを許可して、クエリを準備できるようにすることです。

そうでなければ、あなたは車輪の再発明を始めます。そして、正直に言うと、あなたが本当に多くのパラメータを持つ多くの関数を持っているとは思えません。

したがって、これはエンドユーザーに大きく依存します。エンドユーザーが多くのことをしたい場合は、エンドユーザーが必要に応じてソフトウェアを変更できるように、ソース形式でソフトウェアを提供します。

それまでは、ソフトウェアをリリースして、実際に必要な機能をエンドユーザーからフィードバックしてください。

アプリケーションにとってORMは役に立たないオーバーヘッドかもしれませんが、代わりに、レイジークエリや後で列名の名前を変更する機能など、PDOに加えてもう少し機能が必要です。

$result = PDOQuery::create('* FROM config')->limit(2);

$result->orderBy('`option`');

$result->aliasNames(['option' => 'name'], $removeOther = true);    

foreach ($result as $row) {
    print_r($row);
}

これは単なる例示であり、コードは行をassoc配列として提供するだけです。

Array
(
    [name] => Insert Option 50e60ca17bdf4
)
Array
(
    [name] => Insert Option A 50e78a79ead49
)

foreachに関してのみ実行されます(たとえば、ビューに渡すことができ、ビューがそれを必要としない場合、データベースクエリは実行されません)。

それをさらに拡張することができます。たとえば、クエリを定義するすべてのものが、渡すことができるクエリ定義になります。

イテレータをスタックイテレータにして、クエリが実行された場合に、クエリを再度実行する代わりに結果に制限を適用できるようにすることができます。そして、そうではありません。

これが実際に行うのは、必要に応じてPDOのインターフェイスを強化することだけなので、そのコンポーネントを自分で作成する必要があります。

また、上記のサンプルコードのように、概説されているよりも分離されている必要があります。

于 2013-03-09T15:32:53.513 に答える