2016 年に Doctrine ORM を使用し、約 2 ~ 2.5 年の経験があります。
固有の矛盾
SELECT i, p
FROM \Entity\Item i
JOIN i.product p
WHERE ...
エンティティがItem
と であると仮定しProduct
ます。それらは に接続されてItem.product_id
おりProduct.id
、とともに表示したいものをProduct
含んでいます。Product.model
Item
上記の SQL を使用して、データベースから同じ "product.model" を取得しますが、SQL パラメータは異なります。
//SELECT i, p
$ret[0]->getProduct()->getModel();
//SELECT i as item, p as product
$ret[0]['item']->getProduct()->getModel();
//SELECT i as item, p.model as model
$ret[0]['model'];
私が作っているポイントはこれです:
出力 ResultSet 構造は、DQL/ORM SELECT ステートメントの記述方法によって大幅に変わる可能性があります。
オブジェクトの配列からオブジェクトの連想配列の配列、連想配列の配列まで、目的に応じてSELECT
. SQL に変更を加える必要があると想像してください。次に、コードに戻って、結果セットからのデータの読み取りに関連するすべてのコードをやり直す必要があると想像してください。痛い!痛い!痛い! 数行のコードであっても、結果セットの構造に依存します。完全な分離/共通標準はありません。
Doctrine の得意なこと
いくつかの点で、SQL の処理、独自のテーブルの作成と維持が不要になります。完璧ではありません。時々失敗し、MySQL コマンドラインに移動して SQL を入力し、Doctrine とあなたが満足するポイント、Doctrine がカラムタイプを有効と見なすポイント、カラムタイプに満足できるポイントに調整する必要があります。独自の外部キーやインデックスを定義する必要はありません。自動で魔法のように行われます。
ドクトリンが苦手なこと
非常に高度な SQL を DQL/ORM に変換する必要があるときはいつでも苦労するかもしれません。それとは別に、上記のような矛盾に対処することもできます。
最終的な考え
テーブルを作成/変更し、テーブルデータをオブジェクトに変換して永続化し、準備済みステートメントやその他のチェックアンドバランスを使用してデータをより安全にするDoctrineが大好きです.
PHP のオブジェクト指向インターフェース内から Doctrine によって永続ストレージが管理されているという感覚が気に入っています。自分のデータを自分のコードの一部と考えることができ、ORM がデータベースとのやり取りの厄介なことを処理してくれるという、うずくような感覚を覚えます。データベースはローカル変数のように感じられます。データを大事にすれば、データベースはあなたを愛してくれるということを理解しています。
私は Doctrine が嫌いです。一貫性がなく、学習曲線が難しく、SQL で何かを書く方法を知っているときに DQL の独自の構文を調べなければならないからです。SQL の知識はすぐに利用できます。DQL には、専門家がそれほど多くなく、(SQL と比較して) 行き詰まったときに役立つ蓄積された知識もありません。