1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-28 01:30:11 -07:00

Create missing parts referenced by FK

This commit is contained in:
David Hübner 2017-04-13 18:55:58 +02:00
parent 254add244d
commit 438497f5ca
4 changed files with 68 additions and 21 deletions

View File

@ -24,13 +24,19 @@ class ThemeFilterType extends AbstractType
{
$builder->add('id', Filters\ChoiceFilterType::class, [
'choices' => $this->rebrickableManager->FindAllThemes(),
'choice_label' => function ($allChoices, $currentChoiceKey) {
dump($currentChoiceKey);
$parent = $allChoices->getParent();
return $parent ? $parent->getName().' > '.$allChoices->getName() : $allChoices->getName();
'choice_label' => function ($theme, $currentChoiceKey) {
if($parent = $theme->getParent()) {
if($parentParent = $parent->getParent()) {
if($parentParentParent = $parentParent->getParent()) {
return $parentParentParent->getName().' > '.$parentParent->getName().' > '.$parent->getName().' > '.$theme->getName();
}
return $parentParent->getName().' > '.$parent->getName().' > '.$theme->getName();
} else {
return $parent->getName().' > '.$theme->getName();
}
} else {
return $theme->getName();
}
},
'label' => 'filter.set.theme',
]);

View File

@ -2,8 +2,10 @@
namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\LDraw\Category;
use AppBundle\Entity\Rebrickable\Inventory;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Repository\BaseRepository;
use Doctrine\ORM\Query\Expr\Join;
@ -12,13 +14,14 @@ class Inventory_PartRepository extends BaseRepository
{
public function findAllRegularBySetNumber($number)
{
$queryBuilder = $this->createQueryBuilder('inventory_part');
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory->getId())
$queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->join(Part::class,'part',JOIN::WITH,'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->andWhere('inventory_part.spare = FALSE')
->distinct(true);
@ -27,13 +30,14 @@ class Inventory_PartRepository extends BaseRepository
public function findAllSpareBySetNumber($number)
{
$queryBuilder = $this->createQueryBuilder('inventory_part');
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory->getId())
$queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->join(Part::class,'part',JOIN::WITH,'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->andWhere('inventory_part.spare = TRUE')
->distinct(true);

View File

@ -8,11 +8,24 @@ use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Entity\Rebrickable\Theme;
use AppBundle\Repository\BaseRepository;
use Doctrine\ORM\Query\Expr\Join;
class SetRepository extends BaseRepository
{
public function findAllByTheme(Theme $theme) {
dump($this->getEntityManager()->getRepository(Theme::class)->findAllSubthemes($theme));
$queryBuilder = $this->createQueryBuilder('s')
->join(Theme::class, 'theme',Join::WITH, 's.theme = theme')
->where('theme.id = :id')
->setParameter('id', $theme->getId());
return $queryBuilder->getQuery()->getResult();
}
public function findAllByPartNumber($number)
{
$queryBuilder = $this->createQueryBuilder('s')

View File

@ -2,7 +2,11 @@
namespace AppBundle\Service\Loader;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set;
use Doctrine\ORM\Query\Expr\Join;
//TODO Refactor + validate csv files
class RebrickableLoaderService extends BaseLoaderService
@ -24,18 +28,22 @@ class RebrickableLoaderService extends BaseLoaderService
try {
$connection->beginTransaction();
$connection->prepare('SET foreign_key_checks = 0;')->execute();
$this->truncateTables();
$connection->prepare('SET foreign_key_checks = 1;')->execute();
$this->loadColorTable();
$this->loadPartTable();
$this->loadCategoryTable();
$this->loadPartTable();
$this->loadThemeTable();
$this->loadSetTable();
$this->loadInventoryTable();
$this->loadInventoryPartTable();
$this->loadInventorySetTable();
$connection->prepare('SET foreign_key_checks = 0;')->execute();
$this->loadInventoryPartTable();
$connection->prepare('SET foreign_key_checks = 1;')->execute();
$this->addMissingParts();
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
@ -49,11 +57,11 @@ class RebrickableLoaderService extends BaseLoaderService
TRUNCATE TABLE rebrickable_inventory_parts;
TRUNCATE TABLE rebrickable_inventory_sets;
TRUNCATE TABLE rebrickable_color;
TRUNCATE TABLE rebrickable_category;
TRUNCATE TABLE rebrickable_inventory;
TRUNCATE TABLE rebrickable_set;
TRUNCATE TABLE rebrickable_theme;
TRUNCATE TABLE rebrickable_part;
TRUNCATE TABLE rebrickable_category;
';
return $this->em->getConnection()->prepare($query)->execute();
@ -70,6 +78,22 @@ class RebrickableLoaderService extends BaseLoaderService
return $this->em->getConnection()->prepare($query)->execute();
}
private function addMissingParts() {
$connection = $this->em->getConnection();
$statement = $connection->prepare(
'SELECT DISTINCT rebrickable_inventory_parts.part_id FROM rebrickable_inventory_parts
LEFT JOIN rebrickable_part ON rebrickable_inventory_parts.part_id = rebrickable_part.id
WHERE rebrickable_part.id IS NULL');
$statement->execute();
$foreignKeys = $statement->fetchAll();
foreach ($foreignKeys as $foreignKey) {
$part = new Part();
$part->setNumber($foreignKey['part_id']);
$this->em->getRepository(Part::class)->save($part);
}
}
private function loadInventoryTable()
{
$file = $this->downloadFile($this->rebrickable_url.'inventories.csv');