mysql — Как сохранить данные из Mapper в Entity, используя данные в левом соединении в переполнении стека

У меня есть простой пользовательский класс Entity и Mapper. Mapper используется для получения данных из базы данных, а Entity — это объект коллекции с переменными, методами получения / установки и отношениями между сущностями.

Модель \ Entity \ Категория

class Category extends Entity
{
private $id, $name, $link;

// belongs to
private $category;

// has many
private $categories;

// relations - belongs_to, has_many, has_one...
private $belongs_to = array ('category');
private $has_many = array ('categories');

// here goes getters, setters for id, name, category, categories...
}

Модель \ Mapper \ Категория

class CategoryMapper extends Mapper
{
public function loadTopNavigation()
{
$categories = array();

$data = $this->db->query('SELECT category.name, category.link, category_master.name AS category_name, category_master.link AS category_link
FROM category
LEFT JOIN category AS category_master
ON category_master.id=category.category_id')
->get();

foreach ($data as $row) {
$categories[] = new Category($row);
}

return $categories;
}
}

использование

$categoryMapper = new CategoryMapper();
$categories = $categoryMapper->loadTopNavigation();
foreach ($categories as $category) {
echo '<li>' . $category->getName() . ' - ' . $category->getCategory()->getName() . </li>;
}

Полученный массив из базы данных:

  • название
  • ссылка на сайт
  • category_name
  • category_link

Ожидаемый массив:

  • название
  • ссылка на сайт
  • категория => массив (имя, ссылка)

Я могу получить массив категорий, если у меня есть 2 запроса — сначала я получу категорию, а затем второй запрос получит основную категорию на основе дочернего идентификатора и сохранит ее в $ категории [] [ ‘категории’];

Есть какие-нибудь предложения, что делать? Я мог бы создать метод в классе Mapper, чтобы проверить все category_ строки и установить их в специальные категория = массив () или сделать это в классе Entity … Или есть другой способ?

0

Решение

Я понял! Как я уже говорил в посте выше, я создал метод внутри класса Mapper, который просматривает извлеченные строки из базы данных и проверяет, содержит ли он category_ строка. Если это так, то сохраняет его в специальном массиве $ category.

Сначала я хотел поместить этот метод внутри сущность класс, но что если я переключусь SQL Mapper в XML или же JSON или что-то вроде этого с другими именами ключей, тогда у меня снова будут проблемы с сохранением значений должным образом.

Это выглядит примерно так:

foreach ($data as $key => $value) {
$class = strstr($key, '_', true);
if (in_array($class, $this->belongs_to)) {
// adding $key and $value to newly created array $category = array()
}
}
0

Другие решения

Других решений пока нет …