MODx Revolutionのユーザーデータベースクエリ

標準の名刺サイトには$ modx-> getObject()$ modx-> getCollection()などの十分な標準作業方法があるため、このトピックはかなり大きなMODx Revolutionプロジェクトを持っている人にとって確かに役立ちます。 。 また、これらのメソッドは、基本的にデータベースだけでなくMODxオブジェクトでも機能します。



大規模なプロジェクトで作業する場合、メソッドa la $ modx-> getCollection()は次の2つの理由から最適なソリューションではありません。

1.リソースの過剰使用。 これらのメソッドは、データベースからデータを受信するだけでなく、受信したオブジェクトのインスタンスを作成します。 この場合、10,000個のドキュメントに関する情報を取得すると、10,000個のmodResourceオブジェクトが取得されますが、これはあまりクールではありません。

2.結果のレコードをカウントするタスクは複雑です。 クエリレベルでのカウントの直接的な困難に加えて、たとえ同じドキュメントのレコードを10個取得したとしても、MODxは結果としてmodResourceオブジェクトを1つだけ返します。 そして、これは多くのプログラマーに適しています(彼らはユニークなオブジェクトを受け取って満足しています)が、リソースに過剰に費やされており、最終結果によってリクエストが最適化されていないことはすぐにはわかりませんので、それは誰かに適しません。

さらに、大規模プロジェクトで作業する場合、ほとんどの場合、オブジェクト自体ではなく、情報(データベースからのレコード)のみが必要です。



ここで説明するデータベースを操作する方法には、2つのタスクがあります。

1.データベースクエリをより柔軟に記述できます。

2.何らかの理由で純粋なSQLがフレームワーク内でコーシャではないため(少なくとも、別のタイプのデータベースへの移行、テーブル名、プレフィックス、またはその他の変更の観点から)、標準のxPDOメソッドに準拠します。



要するに。



最初に重要な方法を学ぶ必要があります

$modx->newQuery($class);
      
      







MODxですべてのクエリを作成するには、クエリ全体がダンスする少なくとも1つの基本クラスが常に必要です。



より詳細な例を次に示します。

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $result = $modx->getCollection('modResource', $q);
      
      







この場合、 $ qは、ドキュメントでよく見られるいわゆる基準です。

これは、2番目のパラメーターとして渡す場合、Sortby、leftJoin、innerJoin、Limitなどの多くの重要なメソッドがあるため、より強力なツールにすぎません。



これで、私たちが戦うつもりだったもの、つまり出力でいくつかのmodResourceオブジェクトを取得しました。 このおなじみの例から、目標を達成するのが簡単になります。



それで、少しリクエストをやり直してください。

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->prepare(); $sql = $q->toSQL();
      
      







ここでは、純粋なSQLが既に取得されていますが、これは確かに多くの人に必要です。

この例では、別の重要な方法を見ました。

 $q->prepare();
      
      





彼は最終的なSQLを準備しています。



これで、このSQLを実行できます

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->limit(10); //    $q->prepare(); $sql = $q->toSQL(); $query = $modx->prepare($sql); $query->execute(); $result = $query->fetchAll(PDO::FETCH_ASSOC); print_r($result);
      
      







UPD:この例をデモとして残します$ modx-> prepare($ sql);しかし、この直後に修正された例を1回呼び出す-> prepare();

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->limit(10); //    $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result);
      
      







出力では、データ配列を取得します。

しかし、列の名前はあまり良くありません

[modResource_id] => 0

[modResource_type] =>ドキュメント



明確にするために、明示的なSELECTをクエリに追加します。

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->select(array( 'modResource.*' )); $q->limit(10); $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result);
      
      







これで、列名はすべて問題ありません:-)



そして、今度はかなり有用で説明的な例:1/20のシフトで1/10レコードを取得し、IDでソートします。

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->select(array( 'modResource.*' )); //     $total = $modx->getCount('modResource', $q); //   1/10     //   1/20 (offset) $q->limit($total / 10, $total / 20); //    ID    $q->sortby('id', 'DESC'); $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result);
      
      







ところで、最終的なオブジェクトを取得するためにこれらの例を変更するのは非常に簡単です。



 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->select(array( 'modResource.*' )); //     $total = $modx->getCount('modResource', $q); //   1/10     //   1/20 (offset) $q->limit($total / 10, $total / 20); //    ID    $q->sortby('id', 'DESC'); $q->prepare(); //   $docs = $modx->getCollection('modResource', $q);
      
      







メソッド$ modx-> getObject()および$ modx-> getCollection()の本質は、データベースからデータを取得し、指定されたクラスを開始し、メソッド$ object-> fromArray($ array())を使用して受信データをその中に詰めることです。



ちなみに、print_r($ docs)で遊ぶことは強くお勧めします。ala $ modx-> getCollection()メソッドの結果は、指定されたオブジェクトの配列であり、それぞれが拡張xPDOとMODxオブジェクトを組み合わせたものです。情報。

したがって、オブジェクトから情報を出力するには、$ object-> toArray()メソッドを使用します。

この場合、次のようになります。

 foreach($docs as $doc){ print_r($doc->toArray()); }
      
      







もう1つの注意:MODxオブジェクトの配列内の要素は順不同でリストされ、各キーはオブジェクト(レコード)のIDです。したがって、ID 10のドキュメントは次のようになるため、$ docs [10]で11番目の要素を確実に参照することはできません1番目、100番目、またはまったくない場合がありますが、配列には100個のドキュメントがあります。

次のように結論をやり直すことで、自分で確認できます。

 foreach($docs as $id => $doc){ print "<br />". $id; }
      
      







MODxオブジェクトの配列を操作するには、 ここで説明する配列の要素を操作する方法を研究することが非常に役立ちます



end()-配列の内部ポインターを最後の要素に設定します

key()-配列からキーを選択します

each()-配列から現​​在のキー/値のペアを返し、ポインターをシフトします

prev()-配列の内部ポインターを1つ後ろに移動します

reset()-配列の内部ポインターを最初の要素に設定します

next()-配列の内部ポインターを1つ前の位置に移動します



たとえば、MODx配列から最初の要素を取得する場合、$ doc = $ docs [0];にアクセスできません。 99.9%では、ID = 0のレコードはほとんど使用されないため、何も取得できません。

次のように正しく処理します。$ doc = current($ doc);



この方法が好きな人は、おそらくこの方法で複数のテーブルからより複雑なクエリを一度に作成するでしょう。



PSいくつかの便利なフィルターを使用した小さなチームのリクエスト。

すべての設定は、値がIS NOT NULLであるWEBおよびMGRコンテキストから取得されます!= ''



 $q = $modx->newQuery('modContext'); $where = array( 'modContext.key:in' => array('web', 'mgr'), 'cs.value:!=' => NULL, 'cs.value:!=' => '', ); $q->select(array( 'modContext.key', 'cs.key as setting_key', 'cs.value' )); $q->innerJoin('modContextSetting', 'cs', 'cs.context_key = modContext.key'); $q->where($where); $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result);
      
      






All Articles