1

私は OOPHP の学習過程にあり、「ベスト プラクティス」のアドバイスを探しています。

リレーショナル データベースでは、多くのテーブルに明らかに外部キーがあります。サイトのモデルを作成しているときに、モデルで JOIN クエリを実行する方がよいのか、それとも 1 つのモデルで別のモデルを呼び出す方がよいのかを判断しようとしています。

他のモデルを呼び出すと、コードのモジュール性が保たれるようです。どちらの方法でも、別のテーブルであろうと別のモデルであろうと、依存関係を作成しているようです。

「他のモデルを呼び出す」アプローチを使用すると、別の問題、つまり無限ループに遭遇するようです。これが私が実行している例です。私は2つのテーブルを持っていpersonますschool. それぞれpersonに で表されるお気に入りの学校がありschoolIdます。それぞれschoolprincipal、つまり がありpersonIdます。

person行がマップされるオブジェクトは、そのコンストラクターでオブジェクトを受け入れますschoolschool、学校の行がマップされるpersonオブジェクトは、そのコンストラクターでオブジェクトを受け入れます。

私が見つけたものから、遅延読み込みに関する何かが解決策のようですが、(私が間違っている可能性があります) それを行うと、PHP の型ヒントを使用できないようです。

(多くの人が Doctrine のような ORM ツールを提案してくれると思いますが、それは私が将来必ず検討するものです。学習曲線が急勾配であると想定されているため、またそれらのツールをよりよく理解していると感じているため、今は避けています。後で自分で試してみると)

4

1 に答える 1

0

いい質問です!私は同じ考えを持っていました/持っています。そして、フレームワークを見る前に自分でコードを書き始めるのは本当に良い考えだと思います:)

モデル ジェネレーターをコーディングしたとき、JOINS を使用せず、「遅延読み込み」を使用することに決めました。つまり、次のようなクラスがあります(単なる擬似コード):

class Person extends Model_Resource {

    /**
     *
     */
    protected $name;

    /**
     * @var Address <-- external reference
     */
    protected $address;

    /**
     * @return Person
     */
    public static function select($filter) {
        return DB::instance(filter_query('SELECT * FROM `person`', $filter));
    }


    /**
     * @return Address
     */
    public function getAddress() {
        // lazy loading :
        if(is_null($this->address)) {
            $this->address = Address::select(new Filter('p_id', $this->id));
        }
        return $this->address;
    }

}

それは、中規模のアプリケーションで何年にもわたってうまくいきました。本当に高速化する必要がある場合や、やや不規則なクエリを使用する必要がある場合は、自動生成されたメソッドを自由に上書きして、JOINS、UNION などを使用できます...

他の人が何を言うのか興味があります。

于 2013-02-04T19:23:28.113 に答える