У меня есть простой пользовательский класс 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>;
}
Полученный массив из базы данных:
Ожидаемый массив:
Я могу получить массив категорий, если у меня есть 2 запроса — сначала я получу категорию, а затем второй запрос получит основную категорию на основе дочернего идентификатора и сохранит ее в $ категории [] [ ‘категории’];
Есть какие-нибудь предложения, что делать? Я мог бы создать метод в классе Mapper, чтобы проверить все category_ строки и установить их в специальные категория = массив () или сделать это в классе Entity … Или есть другой способ?
Я понял! Как я уже говорил в посте выше, я создал метод внутри класса 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()
}
}
Других решений пока нет …