Редактировать 3
После прочтения загрузки лодки я действительно не думаю, что с какой-либо ORM или системой в целом можно построить отношения организованных объектов так, как я хочу, в меньшем количестве запросов, которые я использую.Если кто-нибудь может привести пример того, как это возможно, я бы поцеловал вас.
В Редактировать 2 Я думаю, что вложенные циклы - лучшее решение для выполнения
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 запросов.Это плохо.
Edit 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
Вся приведенная ниже информация великолепна, но я играл с ней, и я не могу заставить себя работать, не говоря уже о трехуровневой,Я перепробовал почти все, что мог придумать, и прочитал документы, но по какой-то причине мой мозг не любит 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 |
+----------+
Модели -
project.php
class Project extends DataMapper {
var $has_many = array("slide");
}
// End of project.php
// Location: ./application/models/project.php
slide.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
точка.php
<?php
class Point extends DataMapper {
var $has_one = array("shape");
}
// End of point.php
// Location: ./application/models/point.php
Вышеуказанное должно создать нисходящую-> множество отношений между проектами-> слайды-> фигуры-> точки
Как вы начинаете работать с информацией?Когда я не использовал ORM, я обрабатывал всю обработку данных в модели. Это неправильно для моделей ORM?Скажем, вы хотели получить все точки во всех фигурах в проекте 1, как бы вы решили структурировать такой вызов?
Мне не нужен конкретный код, если вы хотите, чтобы это было полезно.Что мне действительно нужно, так это некоторые идеи о том, как визуализировать уровни объектов, чтобы вы могли иметь дело с каждым на любом уровне.