7

Doctrine クラスで作業しているときにカスタムクエリが必要な場合に、DQL と SQL を使用/学習する明確な (事実がサポートされている) 理由を誰かが教えてくれますか?

ORM の組み込みリレーショナル機能を使用して何かを達成できない場合は、通常、拡張された Doctrine または DoctrineTable クラスにカスタム メソッドを記述します。このメソッドでは、必要なものをストレート SQL で記述します (適切な準備済みステートメント/インジェクション保護などを備えた PDO を使用します...)。DQL は、ほとんどの一般的な状況で使用する十分な説得力のある理由を提供していないように見える、学習/デバッグ/維持するための追加言語のようです。DQL は SQL よりもそれほど複雑ではないように思われます。実際、SQL を十分に理解していなければ、DQL を効果的に使用できるとは思えません。ほとんどのコア SQL 構文は、PHP で使用する最も一般的な DB にかなりうまく移植されています。

何が欠けている/見落としていますか? 理由があると確信していますが、意図的にそれを大幅に使用した人から、プレーンオール SQL を操作することで得られたものについて聞きたいと思います。

ORM をサポートする引数を探しているのではなく、従来の LAMP セットアップ (mysql、postgres などを使用) で、コアの「get-by-relationship」タイプのニーズ以外で何かを行う必要がある場合にのみ DQL を探しています。

4

4 に答える 4

3

正直なところ、私は Doctrine1.2 を使用して SQL を学びました :) 外部キー、カスケード操作、group_concat のような複雑な関数、その他多くのことについてさえ知りませんでした。インデックス付き検索は、すぐに使用できる非常に優れた便利なものでもあります。

DQL は、コードの記述と理解がはるかに簡単です。たとえば、次のクエリです。

$query = ..... // some query for Categories
   ->leftJoin("c.Products p")

カテゴリと製品間の左結合を行い、ON p.category_id=c.id を記述する必要はありません。

将来、リレーションを 1 対 2 多から多対多に変更した場合、この同じクエリはまったく変更せずに機能します。Doctrine がそれを処理します。SQL を使用してこれを行う場合、すべてのクエリを変更して、中間の多対多テーブルを含める必要があります。

于 2012-07-19T07:30:59.943 に答える
2

DQL の方が読みやすく、便利だと思います。正しく構成すると、オブジェクトの結合が容易になり、クエリの記述が容易になります。

コードは、任意の RDBMS に簡単に移行できます。

そして最も重要なことは、DQL はオブジェクト モデルのオブジェクト クエリ言語であり、リレーショナル スキーマの言語ではないということです。

于 2012-07-17T21:55:03.147 に答える
1

Zeljko の答えはかなり的確です。

生の SQL の代わりに DQL を使用する最も重要な理由 (私の本): Doctrine はエンティティをデータベースに永続化する方法から分離します。つまり、基になるストレージが変更されてもエンティティを変更する必要はありません。つまり、基になるストレージに変更を加えたい場合 (つまり、列の名前を変更したり、リレーションシップを変更したり)、DQL を変更する必要はありません。DQL では代わりにエンティティ プロパティを使用するためです (これは、現在のマッピングに応じて、舞台裏で正しい SQL に変換されます)。

于 2013-06-20T15:56:56.483 に答える
1

DQL を使用すると、オブジェクトを処理するのに役立ちます。データベースに挿入する場合、オブジェクトを挿入します

$test = new Test();
$test->attr = 'test';
$test->save();

データベースから選択する場合は、配列を選択し、それをオブジェクトに入力できます

public function getTestParam($testParam)
     {
        $q=Doctrine_Query::create()
                ->select('t.test_id , t.attr')
                ->from('Test t ')
            $p = $q->execute();
            return $p;
     }

詳細については、Doctrine のドキュメントを確認してください。

于 2012-07-18T10:30:28.697 に答える