PHP で実装されたマイクロ AR ライブラリ
サイズが小さく、詳細なコメントが含まれる合計 400 行のみ
チェーン呼び出しをサポート
サポート関係
私が初めて ActiveRecord に触れたのは、当時、Yii を学習していたときでした。 ARを使ってみようと思いました データベースの操作がとても便利です。それで、後で他のフレームワークに目を向けたとき、AR なしではデータベースを操作できないと感じました。 ! !特にフレームワークとも言えない簡易的なものを使ってマイクロPHPサイトを書いていたとき、手書きのSQLはあまりにもダサいと感じていました。
その後、私のお気に入りのイディオムなど、いくつかの優れた独立した ORM ライブラリにも出会い、Yii の AR を単独で使用するというアイデアさえ思いつきました。しかし、それはまだ起こりませんでした。 。 。
2013年、仕事で時間がありすぎた時期があったので、ActiveRecordクラスを自分で実装したいと思い、実践し、将来的にも使用する予定でした。
書き始める前に、github と stackoverflow で多くの php AR ライブラリまたは ORM ライブラリを検索しました。
https://github.com/j4mie/idiorm
https://github.com/vrana/notorm
https://github.com/PrimalPHP/Record
https: //github.com/spadgos/Record
https://github.com/sgoen/php.pdo.orm
https://github.com/jaceju/example-my-orm
もちろん、その中で最も優れているのは idiorm と notorm で、github 上でそれぞれ 1600 個以上と 600 個以上のスターを獲得しています。
イディオムを例に挙げると、私はそれが提供するインターフェイスと使用法が個人的に気に入っています。また、ファイルには 2500 行近くありますが、ライブラリ全体は 1 つのファイルにすぎません。しかし、それはすでに小さな図書館です。もちろん、ファイルは少し長く、少し面倒に見えます。
比較的言えば、notorm はより OO になるように設計されています。ただし、NotORM_Result クラスでは、大量の文字列を SQL に接続する方法がはっきりとわかり、依然として見栄えがよくないと感じられます。
このように多数の ORM ライブラリを見ていると、SQL を直接接続する方法に非常に嫌気がさしますが、これも避けられない問題であり、最終的には SQL 文字列を常に生成する必要があります。 。
重要なのは、この接合作業を完了するためのより「エレガントな」方法を見つけることです。
ある日、結合された SQL を見ていて、SQL の where 以降のクエリ条件が常に 1 つずつ式 (オペランド + 演算子 + オペランド、たとえば : name=') であることに気づきました。 「デモ」および電子メール=「demo@demo.com」)。
这个表达式的结构看起来和数学里面的(1+1)*(2+2)是那么的相像。
Even と と or は 1 つずつ演算子にすぎません。さらに改良するには、バイナリ式に加えて、単項式 (オペランドが 1 つだけある式、数学の -1 に似た式) もあります。このように、SQLにおけるselect、from、where、delete、updateなどのキーワードは「演算子」とみなすことができます。
その後、単純な SQL を 1 つずつ式に分解できます:
select email, password from `user` where email = 'demo@demo.com';
select email,password
from user
where email = 'demo@demo.com '
email = 'demo@demo.com'
上記の SQL は合計 4 つの式に分割されており、そのうちの where 部分はネストされた式です。
そこで、SQL のさまざまな部分を表す Expressions クラスを特別に定義しました。このクラスには、最後に必要なときに SQL を生成する __toString メソッドが 1 つだけあります
class Expressions extends Base { public function __toString() { return $this->source. ' '. $this->operator. ' '. $this->target; }}
もちろん、より特別な式 "()" もあります。この式は演算子が分離されているため特別です。
式クラスが抽出された後、ActiveRecord を使用してデータベースにクエリを実行するときに、動詞を入力するたびに、適切な場所に式を挿入するだけです。 SQL インジェクションのリスクを防ぐために、セキュリティ上の理由から、各式の __toString メソッドが最後に一度だけ呼び出されます。
例:
コードの量を減らすために、ここでは __call マジック メソッドを使用して、アクションごとにメソッドを定義するのを避けています。
SQL の基本操作の実装に加えて、Yii と同様の ActiveRecord メソッドも実装されているため、Relation メソッドは主キーと外部キーの関係を通じて単純にデータをクエリできます。
「HAS_ONE」、「HAS_MANY」、「BELONGS_TO」の 3 つの関係が定義されています。
関係を定義した後は、属性にアクセスするだけで関連データを取得できます。
プロジェクトアドレス: https://github.com/lloydzhou/activerecord
ドキュメントアドレス: https://lloydzhou.github.io/activerecord
はpackagist.orgに提出されており、composer
$user->equal('id', 1);只是在where子句里面生成了一个 "id=:ph1"的表达式,同时保存了一个array(':ph1'=>1)的参数而已。同样的还提供了简写的”eq“以及”ne“,”ge“等接口函数。另外还有”select“,”from“,”group“,”order“,”limit“,”top“以及”where“等接口函数。
このライブラリをテストし、同時に改善するために。そこで、このライブラリを別の Router および MicroTpl と組み合わせて使用し、基本的にこれらのライブラリの API をカバーする簡単なブログを作成しました。