編集 3
ボートロードを読んだ後、一般的に、ORMやシステムでは、使用しているクエリの数を減らして、組織化されたオブジェクトの関係を構築できるとは本当に思いません。それが可能であるという例を提供できる人がいるなら、私はあなたにキスします.
編集 2ネストされた for ループは、実行中の最良のソリューションだと思います
Total_queries = 1 + 2(Slides_in_project) + Shapes_in_project
| | \
Query to get project | \
| \
Query to get slides and double because of points \
\
Get all the shapes in the project
単純なプロジェクトにデータを入力するには、おそらく 200 ~ 500 のクエリを実行することになるため、より良い例が欲しいと思います。これは悪いです。
編集 2
さて、私はこれでしばらく遊んでいて、いくつかの結果が得られていますが、それらが「正しい」方法であるとは思いません。それは私にとって非常に重要です. 私がしていることは、where_related
メソッドを使用して適切なオブジェクトを取得することですが、クエリ数はまだかなり多いと思います.ORMの方がうまくいくことがわかっています. where 関連を使用して適切な階層を作成する場合、ネストされたforeach
ループを使用する必要があり、それが気に入りません。つまり、無駄なクエリです。
これが私が思いついた解決策です
function get_project_points($link_id)
{
echo "<pre>";
foreach($this->where('link_id', $link_id)->get()->slide->where_related('project', 'id', $this)->get() as $slide){
echo $slide->id."<br>";
foreach($slide->shape->where_related('slide', 'id', $slide->id)->get() as $shape){
echo "\t".$shape->id."<br>";
foreach ($shape->point->where_related('shape', 'id', $shape->id)->get() as $point) {
echo "\t\t".$point->id."<br>";
}
}
}
}
これにより、適切な階層構造が出力されます。ご覧のとおり、エコーをオブジェクト/配列の人口に置き換えるのは簡単です。
私がむしろ持っているのは、可能であれば同じことを行う1つの連鎖コマンドであり、スコープも問題ではありません。
より似ているいくつかのチェーン
$this->where('link_id', $link_id)->get()
->slide->where_related('project', 'id', $this)->get()
->shape->where_related('slide', 'id', $slide->id)->get()
->point->where_related('shape', 'id', $shape->id)->get()
もちろん、ネストされた foreach ループと同じ結果に近い結果は得られませんが、知りたいのは、関係を連鎖させ、ネストされた foreach なしでオブジェクトを設定できることです。
そのため、プロファイリングを行ったところ、ネストされた foreach ループが小さなプロジェクトで 63 のクエリを生成し、結果を生成するのにほぼ 0.5 秒かかりました。これは本当に遅すぎます。より良いクエリが必要です。
__________編集 1
以下の情報はすべて素晴らしいですが、私はそれで遊んでいて、3 層の関係はもちろんのこと、関係がうまくいかないようです。私は考えてドキュメントを読むことができるほとんどすべてを試しましたが、何らかの理由で私の脳はORMが好きではありません.
slides
のすべてのIDをエコーしたいだけproject
です。私が無駄に試したことのリストを提供します。私のモデル構造は以下と同じです。メソッドを追加しているだけです。
class Project extends DataMapper {
var $has_many = array("slide");
function get_project_slides($link_id)
{
$this->where('link_id', $link_id)
->where_related('slides', 'project_id'
$this->where('link_id', $link_id)->get()->id
)
->get();
}
}
そして、スライド法で論理的に反対だと思うことを試してみました.
何が間違っているのですか... ORM関係をどのように構築していますか?
元の質問
初めて ORM を使用していますが、コードを構造化して関係からデータを取得する方法を視覚化するのに大きな問題があります。
CodeIgniterで ORM としてDataMapperを使用しています。インストールは問題なく機能しており、すべてのドキュメントを読みましたが、コントローラーで情報を取得する方法がわかりません
+-----------+ +------------+ +---------+ +----------+
| projects | | slides | | shapes | | points |
+-----------+ +------------+ +---------+ +----------+
| id | | id | | id | | id |
+-----------+ | project_id | |slide_id | | shape_id |
+------------+ +---------+ | x |
| y |
+----------+
モデル -
プロジェクト.php
class Project extends DataMapper {
var $has_many = array("slide");
}
// End of project.php
// Location: ./application/models/project.php
スライド.php
<?php
class Slide extends DataMapper {
var $has_many = array("shape");
var $has_one = array("project");
}
// End of slide.php
// Location: ./application/models/slide.php
shape.php
<?php
class Shape extends DataMapper {
var $has_many = array("point");
var $has_one = array("slide");
}
// End of shape.php
// Location: ./application/models/shape.php
point.php
<?php
class Point extends DataMapper {
var $has_one = array("shape");
}
// End of point.php
// Location: ./application/models/point.php
上記は、プロジェクト - >スライド - >シェイプ - >ポイント間に下降する1->多関係を作成する必要があります
情報をどのように扱い始めますか?ORM を使用していないときは、モデルですべてのデータ処理を処理しましたが、これは ORM モデルでは正しくありませんか? プロジェクト 1 のすべての形状のすべてのポイントを取得したいとします。そのような呼び出しをどのように構造化しますか?
必要に応じて、特定のコードは必要ありません。私が本当に必要としているのは、オブジェクトを階層化する方法を視覚化して、任意の階層でそれぞれを処理できるようにする方法についてのアイデアです。