CMSアヌキテクチャ。 デヌタモデル。 パヌト3

前の蚘事で、単玔なサむトのオブゞェクトモデルを䜜成する䟋では、デヌタベヌスからの゚ンティティのシングルダりンロヌドが、Object :: Create$ id構造を持぀識別子を䜿甚しお実行され、どの゚ンティティほずんどの堎合はクラス、どの識別子、これらの゚ンティティを䜜成し、極端な堎合はデヌタベヌスを調べるだけでした。 実際には、存圚を掚枬するこずしかできない、぀たり識別子に関する情報がない゚ンティティに関心がある堎合、識別子による゚ンティティの読み蟌みは問題になりたす。 さらに、特定の条件を満たす耇数の゚ンティティを䞀床にロヌドする必芁がありたす。



たずえば、店舗では、シリアル番号やバヌコヌドで補品を遞択するこずはありたせんが、その意味を理解するこずはありたせん。関心のある補品のプロパティを調べたす。 たずえば、サむトのメむンペヌゞで、最新のニュヌスを衚瀺する必芁がありたす。最新のニュヌスは、デヌタベヌスオブゞェクトデヌタモデルから、Newsクラスの10個のオブゞェクトを䜜成日で゜ヌトしお遞択するこずになりたす。 このようなク゚リを実装するには、オブゞェクトモデルの機胜を考慮しお、゚ンティティを遞択するための条件怜玢条件を蚘述するための柔軟な方法が必芁です。 条件に基づいお、条件を満たす゚ンティティの識別子のデヌタベヌスから盎接遞択するためのSQLコヌドを䜜成する必芁がありたす。識別子がありたす-゚ンティティがありたす。



オブゞェクトアプロヌチを䜿甚しお、怜玢語を䜜成したす。 階局は、論理関数やその他の関数を衚すオブゞェクトから䜜成されたす;理論的には、数孊関数ずしお解釈できたす。 以䞋は、「ニュヌス」クラスの゚ンティティを取埗するための条件の䟋です。 次のように埩号化されたす。属性「sys_name」Q :: Attribが倀「news」Q :: Compに等しいクラスQ :: IsClassに属する゚ンティティQ :: Entityを遞択したす。



$cond = Q::Entity( Q::IsClass( Q::Comp(Q::Attrib('sys_name'), '=', 'news') ) );
      
      





条件は、ク゚リク゚リオブゞェクトの䜜成に䜿甚されたす。 QueryオブゞェクトはSQLコヌドの条件を解釈し、Executeメ゜ッドが呌び出されたずきに実行したす。 ク゚リの結果は、芋぀かった゚ンティティの配列です。たたは、Count関数で条件が始たった堎合、結果は敎数条件を満たした゚ンティティの数になりたす。 ゚ンティティの怜玢は、SQLのLIMITパラメヌタヌで行われるように、番号で制限し、オフセットを実行できたす。制限は、ク゚リを䜜成するずきの2番目ず3番目の匕数、たたはク゚リオブゞェクトのSetCountおよびSetStartメ゜ッドを䜿甚しお実行されたす。



 //     $cond       10 //    (0)  $q = new Query($cond, 10, 0); //  .  –    Object $list = $q->Execute(); if (sizeof($list)>0){ echo $list[0]->getP('head')->getA('value'); //    }
      
      





条件はクラスCondAttrib、CondClass、CondComp、CondCount、CondEntity、CondIsExist、CondLink、CondLog、CondNotExist、CondParamのオブゞェクトから䜜成されたすが、新しい挔算子ずCond *クラスを盎接䜿甚する代わりに構文を単玔化するために、静的Qクラスが䜿甚されたすファクトリメ゜ッド条件オブゞェクトが䜜成されたす。



条件には、匕数゚ンティティ、属性、関係、゚ンティティの属性たたはプロパティの有無をチェックする関数、゚ンティティたたぱンティティ自䜓のプロパティの数をカりントする関数、括匧の圹割も果たす論理関数OrおよびAnd、および属性倀を比范する関数が含たれたすたたは、操䜜 '='、 '>'、 '<'、 '<='、 '> ='、 '<>'、 'like'を䜿甚した数量蚈算関数の結果。



SQLずは異なり、フェッチする堎合、遞択する堎所テヌブルからを指定する必芁も、結果の結合やグルヌプ化も必芁ありたせん。 ク゚リでは、条件の助けを借りお、単に遞択するものが瀺されたす。 オブゞェクトモデルでは絶察にすべおがオブゞェクトであるため、オブゞェクトを陀いお遞択するものはなく、オブゞェクトを怜玢する代わりに、条件を満たすオブゞェクトの数を芋぀けるこずが唯䞀の方法です。 したがっお、条件は垞に゚ンティティ匕数たたぱンティティカりント関数で始たりたす。



 // -   $cond1 = Q::Entity( ); // -   $cond2 = Q::Count(Q::Entity( ));
      
      





最初のケヌスでは、もちろん、ク゚リク゚リで必芁な゚ンティティの数に制限がない堎合、オブゞェクトモデルのすべおの゚ンティティすべおのオブゞェクト、クラス、および関係を含む配列が返されたす。 2番目の堎合、数倀が返されたす-゚ンティティの合蚈数。



絶察にすべおの゚ンティティに関心があるこずはめったにないため、゚ンティティの匕数匕数条件Q ::゚ンティティ$ condは条件$ condによっお補完され、フィルタヌずも呌ばれたす。 条件を継続するかのように、目的の゚ンティティに含める必芁がある属性ずプロパティを決定したす。「...を持぀゚ンティティ」



属性



゚ンティティ属性の倀に条件を蚭定できたす。 これを行うには、属性Q :: Attribを瀺す匕数匕数ず比范関数Q :: Compを䜿甚したす。 次の条件は、「sys_name属性がリンク倀ず等しい゚ンティティ」を意味したす



 $cond = Q::Entity( Q::Comp(Q::Attrib('sys_name'),'=','link') );
      
      





゚ンティティの倀たたは䞀般条件のチェックがあいたいな堎合、論理関数「AND」および「OR」Q :: LogAndおよびQ :: LogOrで条件を補完できたす。 論理関数「AND」および「OR」は、ネストの耇雑な条件を䜜成できるブラケットの圹割も果たしたす。



次の条件のク゚リは、sys_name属性がリンク倀ず等しいか、sys_name属性がラベル倀ず等しく、is_define属性が0である゚ンティティを返したす。



 $cond = Q::Entity( Q::LogOr( Q::Comp(Q::Attrib('sys_name'),'=','link'), Q::LogAnd( Q::Comp(Q::Attrib('sys_name'),'=','label'), Q::Comp(Q::Attrib('is_define'),'=',0) ) ) );
      
      





前の蚘事で䜜成に぀いお説明したオブゞェクトモデルでは、クラスずリンクはsys_name属性を持っおいるため、䞊蚘の条件の結果は、リンククラスず、プロパティを定矩しないシステム名ラベルを持぀リンクになりたす。 結果は、異皮゚ンティティになりたす。 䞎えられた条件が実際に適甚される可胜性は䜎いが、怜玢における゚ンティティのタむプに無関心であるこずをよく瀺しおいたすが、条件は倀が比范される属性の存圚を明確にしないこずに泚意しおください。 怜玢は、人ずほが同じ方法で実行されたす。 たずえば、ランプ、日没、トラクタヌ、ボヌル、血液、牛乳、CCCPフラグなど、さたざたな皮類のオブゞェクトの䞭で赀であるすべおのものを芋぀けるには、問題なく怜玢を実行したす。䞻なものは赀です。



倀ではなくパラメヌタヌ



属性を比范するスカラヌ倀の代わりに、Q :: ParamパラメヌタヌをQ :: Comp比范関数で䜿甚できたす。これにより、生成された芁求の埌でもパラメヌタヌ倀を蚭定できたす。 したがっお、1぀のク゚リを耇数回䜿甚しお、パラメヌタの倀を再割り圓おする可胜性がありたす。



 $cond = Q::Entity( Q::Comp(Q::Attrib('sys_name'),'=', Q::Param('par1')) ); //   $q = new Query($cond); //    $q->SetValue('par1', 'news'); //   $list1 = $q->Execute(); //     $q->SetValue('par1', 'name'); //   $list2 = $q->Execute();
      
      





属性倀を比范するこずに加えお、関数function Q :: IsExistによっお、それらの存圚に条件を単玔に眮くこずができたす。 次の条件は、倀属性を持぀゚ンティティを定矩したす。結果は、文字列ず数字のすべおのオブゞェクトになりたす。



 $cond = Q::Entity( Q::IsExist(Q::Attrib('value')) );
      
      





プロパティ



゜ヌトに関しおは属性に戻り、゚ンティティのプロパティの条件に぀いお説明したす。 プロパティは、接続ず、接続を確立する゚ンティティの組み合わせです。 ク゚リの条件は、プロパティの䞍圚/存圚、たたぱンティティのプロパティの数に単玔に眮くこずができたす。 しかし、最も興味深いのは、プロパティがオブゞェクト繰り返しであるため、接続自䜓たたは接続が確立される゚ンティティの属性ずプロパティに条件を蚭定できるこずです。 考えおみおください。接続ず接続が行われるオブゞェクトは、属性ずプロパティで最も重芁な条件が目的の゚ンティティず同じになる可胜性があるため、すべおを含む条件を䜜成できたす。 たずえば、特定のプロパティを持぀゚ンティティを怜玢できたす。プロパティであるオブゞェクトにはオブゞェクトずの接続プロパティが必芁であり、オブゞェクトには特定のテキストを含むvalue属性が必芁です。 これらすべおを条件にするず、特にシステム名がどのような皮類のプロパティであるかを指定するこずさえできたせん。 怜玢は、条件からわかっおいるものに察しおのみ動䜜したす。 䞀般的に、抜象性、汎甚性、柔軟性。



それでは、必芁な゚ンティティのプロパティの存圚をチェックする条件から始めたしょう。 実際、条件でプロパティを指定するずいう事実によっおプロパティの存圚が決たるため、条件関数Q :: IsExistを䜿甚する必芁はありたせん。



 $cond = Q::Entity( Q::Property( ) );
      
      





同じこず



 $cond = Q::Entity( Q::IsExist(Q::Property()) );
      
      





䞊蚘の条件はプロパティの存圚を決定し、指定されおいないものがあるため、この条件でのク゚リは、少なくずも1぀のプロパティを持぀すべおの゚ンティティになりたす。぀たり、「プロパティを持぀゚ンティティ」です。



逆は、プロパティがないこずを確認しおいたす。 プロパティがないこずを刀断するには、Q :: NotExist条件関数を䜿甚したす。 以䞋の条件の結果は、プロパティを持たないすべおの゚ンティティになりたす。



 $cond = Q::Entity( Q::NotExist(Q::Property()) );
      
      





特定のプロパティを調敎する方法は Q ::プロパティ$ link_cond、$ entity_condには、接続の条件ず接続が確立される゚ンティティの条件をそれぞれ決定する2぀の匕数がありたす。 繰り返したすが、通信もオブゞェクトなので、その条件ぱンティティの堎合ずたったく同じです。 たずえば、属性条件。



次の条件は、プロパティの関係に属性条件を䜿甚したす。 この条件でのク゚リは、耇数のプロパティサむズ= 0は耇数を意味したすを持぀゚ンティティを返し、ニュヌスのみがそれを持ちたす。 より正確には、サむズ属性がれロに等しい接続は、コメントを定矩するニュヌスクラスにあり、最初のニュヌスにはコメントが2぀あり、2番目のニュヌスにはコメントがありたせん前の蚘事の図を参照。



 $cond = Q::Entity( Q::Property( Q::Comp(Q::Attrib('size'),'=',0)) );
      
      





次に、リレヌションシップが䜜成される゚ンティティに条件を远加したす。リレヌションシップが䜜成される゚ンティティのプロパティに条件を蚭定したす。 次の条件は、耇数のプロパティを持぀゚ンティティを返したす。プロパティである゚ンティティは、プロパティを指定せずに独自のプロパティを持ちたすが、倀属性に「First」ずいうテキストのフラグメントが含たれる゚ンティティに関連付けられたす。 条件は抜象的であるこずが刀明したした。 ニュヌスオブゞェクトにはコメントがあり、そのタむトルは「最初」ずいう単語で始たるため、実際には最初のニュヌスになりたす。 ニュヌス項目ず解説の関係は、条件にちょうど合う



 $cond = Q::Entity( Q::Property( Q::Comp(Q::Attrib('size'),'=',0), //  Q::Entity( //   ,     Q::Property( null, //     Q::Entity(Q::Comp(Q::Attrib('value'),'like','%%')) ) ) ) );
      
      





プロパティの数をカりントする条件の䟋を瀺したしょう。 次の条件は、4぀以䞊のプロパティを持぀゚ンティティを返したす。 圌らは最初のニュヌスずクラスのカテゎリになりたす。 このニュヌスには、カテゎリ、芋出し、テキスト、および2぀のコメントぞのリンクがあり、合蚈5぀のプロパティがありたす。 カテゎリクラスには、名前、説明、およびオブゞェクトのプロパティを定矩する4぀の関係合蚈6がありたす。この条件では、考慮する関係を指定したせんでした。



 $cond = Q::Entity( Q::Comp(Q::Count(Q::Property()), '>', 4) );
      
      





プロパティに条件を远加するこずを制限するものはありたせん;目的の゚ンティティでプロパティの圹割を果たす゚ンティティでプロパティカりントを実行するこずもできたす。



本質である本質



実際には、他の゚ンティティのプロパティである゚ンティティを怜玢するこずがしばしば必芁です。 たずえば、特定のニュヌスアむテムに属するコメントを怜玢したす。 これらの目的のために、プロパティ匕数匕数ず同様に条件匕数Q :: IsPropertyが䜿甚されたすが、唯䞀の違いは、関係ず関係を所有する゚ンティティを定矩するこずです。 そうでなければ、すべおが同じです-コミュニケヌションの条件、本質の条件。 必芁な゚ンティティを参照する゚ンティティの数を蚈算し、少なくずも2人の所有者が必芁であるずいう条件を蚭定するこずもできたす。



 $cond = Q::Entity( Q::Comp(Q::Count(Q::IsProperty()), '>=', 2) );
      
      





指定された条件は、クラス「string」、「long_string」、「category」、および「Events」ずいう名前のルヌトカテゎリのオブゞェクトを返したす。これらすべおの゚ンティティには耇数の所有者がいたす。



クラスメンバヌシップ



別の重芁でよく䜿甚される条件は、Q :: IsClassクラスに属しおいるこずです。 クラスに属するこずは実際にはオブゞェクトのプロパティですが、チェックするための特別な方法が必芁です。 継承の階局を考慮する必芁がありたす。぀たり、クラスメンバシップの怜蚌は、接続が確立される゚ンティティの通垞の怜蚌に芁玄されたせん。 たずえば、ニュヌスオブゞェクトはクラス「news」に属したすが、クラス「content」および基本クラス「id」にも属したす。 以䞋の条件はすべおのコメントを返したす。



 $cond = Q::Entity( Q::IsClass( Q::Comp(Q::Attrib('sys_name'), '=', 'comment') ) );
      
      





クラスはオブゞェクトでもあるため、゚ンティティだけでなくクラスの条件も調敎できたす。属性ずプロパティを確認しおください。



Q :: LogAndおよびQ :: LogOr論理関数の䜿甚は、属性倀を比范するこずによっおのみ実蚌され、プロパティQ :: Property、Q :: IsProperty、クラスQ :: IsClassおよびQ関数に属する条件匕数を含めるこずができたす。 :: IsExistおよびQ ::必芁な柔軟性を提䟛するNotExist。



仕分け



゜ヌトなしの怜玢は良くありたせん。 䞊べ替えを䜿甚するず、関連するトピック、人気のある補品などを芋぀けお適甚し、サむトのメむンペヌゞで人気のあるコンテンツを䜜成できたす。 しかし、条件が゚ンティティの構造に぀いお䜕も指定しない堎合に、条件の考えられるすべおのバリアントを考慮しお、必芁な゚ンティティを゜ヌトする方法は 実際、゜ヌトの定矩は非垞に単玔であり、怜玢SQLク゚リの実行時にDBMSで盎接実行されたす。



圓然、スカラヌ倀-属性倀で゜ヌトできたす。 䞊べ替えオプションは、Q :: Attrib属性の条件匕数匕数で指定されたす。 したがっお、䞊べ替えられた属性の定矩ず䞊べ替えパラメヌタヌ降順たたは昇順、䞊べ替え順序-䞊べ替え可胜な属性が耇数ある堎合は、䞊べ替え順序を指定できたす、および必芁な゚ンティティに存圚する属性の条件が結合されたす。



目的の゚ンティティに必ずしも属さない属性で゜ヌトできたす。少なくずも、目的の゚ンティティずの䞀連のリレヌションシップに間接的に関連付けられおいる゚ンティティの属性で゜ヌトできたす。 属性の関係は、プロパティであるリレヌションずオブゞェクトに蚭定できるこずを芚えおいたすか そのため、属性で䞊べ替えるこずもできたす。 サむト䞊のニュヌスは、䜜成日ずニュヌスの著者の評䟡によっお同時に゜ヌトできるこずがわかりたした。 たたは、賌入した補品を、賌入した店舗の名前で䞊べ替えるようなものです。補品に盎接関係のないプロパティで䞊べ替えたす。



理論的には、゚ンティティのプロパティの数、たずえばニュヌスのコメントの数で゜ヌトするこずは可胜ですが、䞀時的にこの機胜は実装されおいたせん。



たた、属性その名前は䞊べ替えパラメヌタヌで指定されたすが、同時に、属性倀の型に぀いおの説明は必芁ありたせん。 特に、value属性は異なるクラスのオブゞェクトに存圚し、最も重芁なこずには、異なるクラスの倀のタむプに違いがありたす。 異なる長さ、敎数、実数の文字列。 ただし、このような状況でも、゜ヌトは機胜したす。 次の条件は、value属性を持぀オブゞェクトの゜ヌトされたリストを返したす。 ゜ヌトは、倀属性に埓っお昇順で行われたす。 2番目の匕数trueはこの属性による゜ヌトを決定し、3番目1-゜ヌト順序いく぀かの゜ヌト可胜な属性に関連および最埌の属性゜ヌトタむプfalse-昇順、true-降順



 $cond = Q::Entity( Q::IsExist(Q::Attrib('value', null, true, 1, false)) ); //       $q = new Query($cond,0,0); $list = $q->Execute();
      
      







おわりに



怜玢甚語を䜜成するための提案されたアプロヌチは耇雑に思えるかもしれたせんが、それはSQLおよびプログラミング蚀語で行われおいるように、条件の文字列蚘述にすべお慣れおいるためです。 オブゞェクトアプロヌチは、第䞀に、プログラム分析ずSQLク゚リの自動生成に䟿利です。第二に、意味のあるGUIむンタヌフェむスを簡単に䜜成できるようになりたす。



さらに倧きな懞念事項は、パフォヌマンスの問題ず、これらの非垞に柔軟な条件から生じるSQLク゚リです。 芁求はそれほど怖いものではありたせんが、耇数のLEFT JOIN-nov sinや他のデザむンを䜿甚するこずにより、柔軟性を実珟するこずは困難です。



プロゞェクトサむト boolive.ru



UPD 1幎埌、 リレヌショナルDBMSのObject DBの蚘事で、デヌタモデルに関する䜜業の結果を知るこずを提案したす。



プロゞェクトの開発は別の方法で行われ、シンプルさの重芁性を認識したした:)



All Articles