1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-17 21:00:09 -07:00

Improve repository queries

This commit is contained in:
David Hübner 2017-04-26 16:30:54 +02:00
parent 71b362b346
commit 6c495d1f28
9 changed files with 64 additions and 44 deletions

View File

@ -23,7 +23,7 @@ class Inventory_Part
/**
* @var Color
* @ORM\Id
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Color", inversedBy="inventoryParts")
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Color", inversedBy="inventoryParts", fetch="EAGER")
*/
protected $color;
@ -37,7 +37,7 @@ class Inventory_Part
/**
* @var Part
* @ORM\Id
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Rebrickable\Part", inversedBy="inventoryParts")
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Rebrickable\Part", inversedBy="inventoryParts", fetch="EAGER")
*/
protected $part;

View File

@ -37,7 +37,7 @@ class Part
/**
* @var Model
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\LDraw\Model", inversedBy="parts")
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\LDraw\Model", inversedBy="parts", fetch="EAGER")
*/
private $model;

View File

@ -2,6 +2,25 @@
namespace AppBundle\Repository;
use AppBundle\Entity\Rebrickable\Inventory;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Set;
use Doctrine\ORM\Query\Expr\Join;
class ColorRepository extends BaseRepository
{
public function findAllBySet(Set $set)
{
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($set->getNumber());
$queryBuilder = $this->createQueryBuilder('color');
$queryBuilder
->join(Inventory_Part::class, 'inventory_part', Join::WITH, 'inventory_part.color = color.id')
->where('inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory)
->distinct(true);
return $queryBuilder->getQuery()->getResult();
}
}

View File

@ -18,9 +18,8 @@ class ModelRepository extends BaseRepository
public function getFilteredQueryBuilder()
{
$queryBuilder = $this->createQueryBuilder('model')
// ->where('model.name NOT LIKE :obsolete')
// ->setParameter('obsolete','~%')
;
->where('model.name NOT LIKE :obsolete')
->setParameter('obsolete','~%');
return $queryBuilder;
}

View File

@ -4,6 +4,7 @@ namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Repository\BaseRepository;
use Doctrine\ORM\Query;
class InventoryRepository extends BaseRepository
{
@ -13,8 +14,9 @@ class InventoryRepository extends BaseRepository
->where('inventory.set = :setNumber')
->setParameter('setNumber', $number)
->orderBy('inventory.version', 'DESC')
->setMaxResults(1);
->setMaxResults(1)
->select('inventory.id');
return $queryBuilder->getQuery()->getOneOrNullResult();
return $queryBuilder->getQuery()->getSingleScalarResult();
}
}

View File

@ -3,6 +3,7 @@
namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\LDraw\Category;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Inventory;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Part;
@ -11,32 +12,38 @@ use Doctrine\ORM\Query\Expr\Join;
class Inventory_PartRepository extends BaseRepository
{
public function findAllRegularBySetNumber($number)
/**
* Finds all inventoty_parts in newest inventory of set.
*
* @param string $number Unique number identifier of set
* @param bool $spare If true - find all spare parts, false - find all regular parts, null - spare and regular parts
* @param bool $model If true - find all parts with model relation, false - find all parts without model relation, null - all parts
* @return array
*/
public function findAllBySetNumber($number, $spare = null, $model = null)
{
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$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')
->setParameter('inventory', $inventory)
->andWhere('inventory_part.spare = FALSE')
->distinct(true);
->where('inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory);
return $queryBuilder->getQuery()->getResult();
if($spare !== null) {
$queryBuilder
->andWhere('inventory_part.spare = :spare')
->setParameter('spare', $spare);
}
public function findAllSpareBySetNumber($number)
{
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$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')
->setParameter('inventory', $inventory)
->andWhere('inventory_part.spare = TRUE')
->distinct(true);
if($model !== null) {
$queryBuilder
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part');
if($model === true) {
$queryBuilder->andWhere('part.model IS NOT NULL');
} else {
$queryBuilder->andWhere('part.model IS NULL');
}
}
return $queryBuilder->getQuery()->getResult();
}
@ -46,14 +53,10 @@ class Inventory_PartRepository extends BaseRepository
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$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())
->where('inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory)
->andWhere('inventory_part.color = :color')
->setParameter('color', $color)
->distinct(true);
->setParameter('color', $color);
return $queryBuilder->getQuery()->getResult();
}

View File

@ -3,7 +3,6 @@
namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\LDraw\Part;
use AppBundle\Entity\Rebrickable\Category;
use AppBundle\Entity\Rebrickable\Inventory;
use AppBundle\Entity\Rebrickable\Inventory_Part;
@ -40,12 +39,12 @@ class PartRepository extends BaseRepository
{
$queryBuilder = $this->createQueryBuilder('part');
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder
->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.number = inventory_part.part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory.id')
->join(Set::class, 's', Join::WITH, 'inventory.set = s.number')
->where('s.number LIKE :number')
->setParameter('number', $number)
->where('inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory)
->distinct(true);
return $queryBuilder->getQuery()->getResult();

View File

@ -15,8 +15,6 @@ 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')

View File

@ -30,7 +30,7 @@
{
$models = [];
$inventoryParts = $this->inventoryPartRepository->findAllRegularBySetNumber($set->getNumber());
$inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true);
/** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) {
@ -58,7 +58,7 @@
{
$models = [];
$inventoryParts = $this->inventoryPartRepository->findAllSpareBySetNumber($set->getNumber());
$inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true);
/** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) {