编辑 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>";
}
}
}
}
这会输出一个很好的分层结构,如您所见,用对象/数组填充替换回声很容易。
我宁愿拥有一个链式命令,如果可能的话,它会做同样的事情,这样范围界定也不是问题。
一些链条更像
$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 个查询,并且需要将近半秒的时间来生成结果。这实在是太慢了。一定有更好的查询。
__________编辑 1
以下所有信息都很棒,但我一直在玩它,我似乎无法建立任何关系,更不用说 3 层了。我已经尝试了我能想到的所有内容并阅读了文档,但出于某种原因,我的大脑不喜欢 ORM。
我只想slides
在一个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,在可视化如何构建代码以从关系中提取数据时遇到了巨大的问题。
我使用DataMapper作为我的 ORM 和CodeIgniter。我的安装工作正常,我阅读了所有文档,但我无法理解如何在控制器中获取信息
+-----------+ +------------+ +---------+ +----------+
| 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
形状.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
点.php
<?php
class Point extends DataMapper {
var $has_one = array("shape");
}
// End of point.php
// Location: ./application/models/point.php
以上应该在项目->幻灯片->形状->点之间创建一个递减的一>多关系
你如何开始处理信息?当我不使用 ORM 时,我在模型中处理了所有数据处理,这对于 ORM 模型是否不正确?假设您想获得项目 1 中所有形状的所有点,您将如何构建这样的调用?
如果您愿意,我真的不需要特定的代码会有所帮助。我真正需要的是一些关于如何可视化如何分层对象的想法,以便您可以在任何层处理每个对象。