1

私のDBレイヤークラスには、selectsqlクエリをparamとして受け取るメソッドがあります。

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  $ret = $stmt->fetch(PDO::FETCH_ASSOC);
  return $ret;
}

フェッチしたデータをモデルに返し、ビューでPDOを使用せずに、ビュークラスでループできるようにしたいと考えています。

これはどのように正しい方法で行う必要がありますか?

$row['testCol']などとしてテーブルの行に到達できるようにしたい。

4

3 に答える 3

2

fetchAll()の代わりにを呼び出します。これによりfetch()、完全な多次元配列が返されます。

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  $ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
  return $ret;
}

$results = $your_object->select("SELECT * FROM yourtable");
// It's a 2D array!
var_dump($results);
于 2012-09-27T19:31:22.463 に答える
2

モデルはレイヤーです。クラスやオブジェクトではありません。

また、 SRPに準拠してコードを記述した場合、モデルレイヤーにはいくつかの異なるタイプの構造が含まれます。少なくとも、ドメインビジネスロジックとストレージ抽象化のために別々のクラスがあります。

あなたがここに持っているのは完全な混乱です。ドメインロジックとストレージメカニズムの両方を同じクラスにまとめる(そしてそれが「モデル」であるかのように見せかける)だけでなく、SQLをプレゼンテーション層に直接公開します。


適切なモデルレイヤーを構築しようとした場合、現在のビューはサービスインスタンス(ドメインビジネスロジックをビューおよびコントローラーから分離するために使用する構造のタイプ)から情報を要求し、必要なデータを取得します。

このサービスは、適切なドメインオブジェクトをインスタンス化し、以前にコントローラーによって設定された状態に基づいて、何らかの形式のストレージ抽象化(データマッパーリポジトリ作業単位dao、または同様の構造)を使用してそれらに情報を取得します。次に、入力されたドメインオブジェクトに対して必要なデータ操作を実行した後、データをビューに返します。

ビューは、コントローラーから受信した情報と以前の信号に基づいて、どのような種類の応答を生成するかを決定します。応答の指示がHTMLの場合、出力を構成するために1つまたは(通常は)複数のテンプレートを使用します。リダイレクトをトリガーするために、HTTPロケーションヘッダーだけを送信する方がよいと考えました。

さらに読むために、私はこの答えをお勧めします。


重要なのは、現在、MVCの概念を単純化して、プレゼンテーションとモデルレイヤーの分離さえも破られているということです。

于 2012-09-28T00:09:31.230 に答える
2

簡単に戻ることができます$stmt。それはあなたがそれを繰り返すことを可能にし、次のようにアクセス可能ですPDO::FETCH_ASSOC

$rows = $model->select($sqlQuery);

...

foreach($rows as $row)
{
    echo $row['testCol'], "\n";
}

関数内では、次のようになります。

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  return $stmt;
}

シンプルに保つと、長期的には役立ちます。ビューには配列のようにアクセスできるものだけが必要であり、PDOはそれを箱から出して提供します。必要に応じて、後で簡単に配列に置き換えることができます。配列の最良の例ではないかもしれませんが、あなたはその考えを理解していると確信しています。

そして、余白に注意してください。モデルとは呼ばず、データベースなどと呼んでください。常に役立つものに名前を付ける方が適切です。

于 2012-09-29T15:03:42.153 に答える