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

View File

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

View File

@ -2,6 +2,25 @@
namespace AppBundle\Repository; 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 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() public function getFilteredQueryBuilder()
{ {
$queryBuilder = $this->createQueryBuilder('model') $queryBuilder = $this->createQueryBuilder('model')
// ->where('model.name NOT LIKE :obsolete') ->where('model.name NOT LIKE :obsolete')
// ->setParameter('obsolete','~%') ->setParameter('obsolete','~%');
;
return $queryBuilder; return $queryBuilder;
} }

View File

@ -4,6 +4,7 @@ namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Repository\BaseRepository; use AppBundle\Repository\BaseRepository;
use Doctrine\ORM\Query;
class InventoryRepository extends BaseRepository class InventoryRepository extends BaseRepository
{ {
@ -13,8 +14,9 @@ class InventoryRepository extends BaseRepository
->where('inventory.set = :setNumber') ->where('inventory.set = :setNumber')
->setParameter('setNumber', $number) ->setParameter('setNumber', $number)
->orderBy('inventory.version', 'DESC') ->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; namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\LDraw\Category; use AppBundle\Entity\LDraw\Category;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Inventory; use AppBundle\Entity\Rebrickable\Inventory;
use AppBundle\Entity\Rebrickable\Inventory_Part; use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Part;
@ -11,32 +12,38 @@ use Doctrine\ORM\Query\Expr\Join;
class Inventory_PartRepository extends BaseRepository 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); $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder = $this->createQueryBuilder('inventory_part') $queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') ->where('inventory_part.inventory = :inventory')
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number') ->setParameter('inventory', $inventory);
->where('part.category != 17')
->setParameter('inventory', $inventory)
->andWhere('inventory_part.spare = FALSE')
->distinct(true);
return $queryBuilder->getQuery()->getResult();
if($spare !== null) {
$queryBuilder
->andWhere('inventory_part.spare = :spare')
->setParameter('spare', $spare);
} }
public function findAllSpareBySetNumber($number) if($model !== null) {
{ $queryBuilder
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); ->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part');
if($model === true) {
$queryBuilder = $this->createQueryBuilder('inventory_part') $queryBuilder->andWhere('part.model IS NOT NULL');
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') } else {
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number') $queryBuilder->andWhere('part.model IS NULL');
->where('part.category != 17') }
->setParameter('inventory', $inventory) }
->andWhere('inventory_part.spare = TRUE')
->distinct(true);
return $queryBuilder->getQuery()->getResult(); return $queryBuilder->getQuery()->getResult();
} }
@ -46,14 +53,10 @@ class Inventory_PartRepository extends BaseRepository
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder = $this->createQueryBuilder('inventory_part') $queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory') ->where('inventory_part.inventory = :inventory')
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number') ->setParameter('inventory', $inventory)
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->andWhere('inventory_part.color = :color') ->andWhere('inventory_part.color = :color')
->setParameter('color', $color) ->setParameter('color', $color);
->distinct(true);
return $queryBuilder->getQuery()->getResult(); return $queryBuilder->getQuery()->getResult();
} }

View File

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

View File

@ -15,8 +15,6 @@ class SetRepository extends BaseRepository
{ {
public function findAllByTheme(Theme $theme) public function findAllByTheme(Theme $theme)
{ {
dump($this->getEntityManager()->getRepository(Theme::class)->findAllSubthemes($theme));
$queryBuilder = $this->createQueryBuilder('s') $queryBuilder = $this->createQueryBuilder('s')
->join(Theme::class, 'theme', Join::WITH, 's.theme = theme') ->join(Theme::class, 'theme', Join::WITH, 's.theme = theme')
->where('theme.id = :id') ->where('theme.id = :id')

View File

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