У меня есть стол (ayrshireminis_car_category
), который построен с иерархической структурой.
Я пытаюсь использовать Расширение Доктрины Гедмо вытащить переменную-член «level», которую я использую в другом месте, поэтому я ожидаю, что у родителя будет уровень 1, у ребенка — уровень 2, у внука — уровень 3 и так далее … ,
Это моя сопоставленная сущность:
AyrshireMinis\CarBundle\Entity\Category:
type: entity
table: ayrshireminis_car_category
gedmo:
tree:
type: nested
id:
id:
type: integer
length: 11
generator: { strategy: AUTO }
fields:
name:
type: string
length: 150
active:
type: boolean
default: true
position:
type: integer
length: 11
level:
type: integer
gedmo:
- treeLevel
createdAt:
type: datetime
gedmo:
timestampable:
on: create
column: created_at
updatedAt:
type: datetime
gedmo:
timestampable:
on: update
column: updated_at
manyToOne:
parent:
targetEntity: AyrshireMinis\CarBundle\Entity\Category
inversedBy: children
gedmo:
- treeParent
createdBy:
targetEntity: \Sylius\Component\Core\Model\UserInterface
joinColumn:
nullable: false
name: created_by
gedmo:
blameable:
on: create
updatedBy:
targetEntity: \Sylius\Component\Core\Model\UserInterface
joinColumn:
nullable: false
name: updated_by
gedmo:
blameable:
on: update
oneToMany:
products:
targetEntity: AyrshireMinis\CarBundle\Entity\Product
mappedBy: category
С этим отображением я получаю следующую ошибку:
Недостающие свойства: слева, справа в классе —
AyrshireMinis \ CarBundle \ Entity \ Category 500 Внутренняя ошибка сервера —
InvalidMappingException
Тем не менее, я не хочу, чтобы «левый» и «правый» столбец в моей таблице. Как я могу обойти это?
Не изменяя схему и сильно полагаясь на расширение Gedmo, я смог извлечь «уровень» следующим образом:
/**
* get a numeric representation of the press category level
* i.e. parent categories - 0, child categories - 1, grandchild categories - 2 etc...
*
* @return int
*/
public function getLevel()
{
$level = 0;
$category = $this;
// parent category
if ($category->hasParent() === false) {
return $level;
}
while ($category = $category->getParent()) {
$level++;
}
return $level;
}
/**
* @return bool
*/
public function hasParent()
{
return ($this->parent != null ? true : false);
}
Других решений пока нет …