1

おそらく私の質問は、stackoverflow の他の場所で部分的に回答されていると思いますが、それらをまとめて質問することで、より包括的な回答が得られるのではないかと感じました。入力する可能性のあるばかげたことをお詫びします--私はPHPで十分に働いていないので、そうするとき、私はそれをもう一度勉強しているように感じます.

とにかく、次の列を持つ「項目」と呼ばれる mysql データベース テーブルがあるとしましょう: item_iditem_typeitem_name。そして、次のような PHP クラスがあります。

class Item
{
    public $item_id;
    public $item_type;
    public $item_name;
}

つまり、データベースからクラス オブジェクトへの直接マップが必要なだけです。

私は "load" と呼ばれるクラスにメソッドを含めることにしました。このメソッドは、item_id. だからここに私の2つの質問があります:

  1. クラス内でデータベースに接続する最良の方法は何ですか? クラス内で新しい PDO オブジェクトをインスタンス化する必要がありますか、それとも load メソッドのパラメータとして PDO データベース ハンドルを渡す必要がありますか? それは問題ですか?
  2. これは、クラスのプロパティを割り当てる方法として意味がありますか、またはこれを行うためのよりスマートな方法はありますか?

    $sth = $dbh->query("SELECT * FROM items WHERE item_id = $item_id");
    $sth->setFetchMode(PDO::FETCH_CLASS, 'Item');
    while ($obj = $sth->fetch()) {
        foreach ($obj as $key => $value) {
            $this->$key = $value;
        }
    }   
    

編集: これらの回答(確かに興味深い読み物になります)を見た後、おそらく十分に詳しく説明していないことに気付きました。

ORM ライブラリを使用することは、私がやっていること (単なる個人的な趣味のプロジェクトであり、雇用者のためのものではない) にとってやり過ぎかもしれないと思いますが、実際には、それが私が必要としているものであるかどうかは確信が持てません。理由は次のとおりです。私はこのようなものを持っているかもしれないので:

class InventoryItem extends Item
{
    public $user_id;
    public $quantity;
}

私はこれを本当に考えていませんでした。例を挙げただけです。したがって、データを取得するために使用するクエリは次のようになります。

SELECT * 
FROM items, inventories 
WHERE item.item_id = inventories.item_id 
AND user_id = $user_id;

つまり、クラスのデータを正しく引き出す SQL ステートメントを作成する必要があり、データベース ハンドルを渡す必要があるのか​​、それとも load メソッド内で作成する必要があるのか​​を知る必要があります。上記のコードは、プロパティ値を割り当てる良い方法として理にかなっています。

追加の問題は、一部のデータを操作する必要がある可能性があることです (たとえば、列の 1 つに json でエンコードされた配列などを格納している場合など)。

4

2 に答える 2

1

ジェネリックなデータベース オブジェクト クラスを使用し、それぞれがそれを拡張する個々のクラス (データベース内のさまざまなテーブルに一致する) を持っています。

データベースオブジェクトクラスには、行をオブジェクトにインスタンス化し、任意の処理を実行する関数が含まれています。それらを拡張するクラスには、各テーブルオブジェクトの属性が含まれているだけです。

これは非常にオープンエンドの質問であるため、programmers.stackexchange で尋ねたほうがよいかもしれません。これを行うにはさまざまな方法とこの問題に関する意見があると思います。

于 2013-07-02T21:51:26.283 に答える
0

オブジェクト リレーショナル マッパー (orm) を探しています。これは、データベース テーブルにマップするオブジェクトを定義できるライブラリです。

Doctrineは、PHP に適した ORM のようです。他にあります。

于 2013-07-02T09:05:08.853 に答える