1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-16 20:30:09 -07:00
PrintABrick/src/AppBundle/Repository/LDraw/ModelRepository.php

134 lines
4.3 KiB
PHP

<?php
namespace AppBundle\Repository\LDraw;
use AppBundle\Entity\LDraw\Alias;
use AppBundle\Entity\LDraw\Category;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\LDraw\Subpart;
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;
class ModelRepository extends BaseRepository
{
public function getFilteredQueryBuilder()
{
$queryBuilder = $this->createQueryBuilder('model')
->where('model.name NOT LIKE :obsolete')
->setParameter('obsolete', '~%');
return $queryBuilder;
}
public function findAllByCategory($category)
{
$queryBuilder = $this->createQueryBuilder('model')
->join(Category::class, 'type', Join::LEFT_JOIN, 'model.category = :category')
->setParameter('category', $category);
return $queryBuilder->getQuery();
}
public function findOneByNumber($number)
{
$model = $this->createQueryBuilder('model')
->where('model.id LIKE :number')
->setParameter('number', $number)
->getQuery()->getOneOrNullResult();
if (!$model) {
$model = $this->createQueryBuilder('model')
->leftJoin(Alias::class, 'alias', JOIN::WITH, 'alias.model = model')
->where('alias.id LIKE :number')
->setParameter('number', $number)
->getQuery()->getOneOrNullResult();
}
return $model;
}
public function findOneByName($name)
{
return $this->findOneBy(['name' => $name]);
}
public function findAllRegularBySetNumber($number)
{
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder = $this->createQueryBuilder('model');
$queryBuilder
->join(Part::class, 'part', JOIN::WITH, 'part.model = model')
->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.id = inventory_part.part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory)
->addSelect('inventory_part')
->distinct(true);
return $queryBuilder->getQuery()->getScalarResult();
}
public function findAllBySetNumber($number)
{
$queryBuilder = $this->createQueryBuilder('model');
$queryBuilder
->join(Part::class, 'part', JOIN::WITH, 'part.model = model')
->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.id = inventory_part.part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory.id')
->join(Set::class, 's', Join::WITH, 'inventory.set = s.id')
->where('s.id LIKE :number')
->setParameter('number', $number)
->distinct(true);
return $queryBuilder->getQuery()->getResult();
}
public function findAllRelatedModels(Model $model)
{
$queryBuilder = $this->createQueryBuilder('model');
$queryBuilder
->select('related')
->join(Subpart::class, 'subpart', JOIN::WITH, 'model.id = subpart.subpart')
->join(Subpart::class, 'parent', JOIN::WITH, 'subpart.parent = parent.parent')
->join(Model::class, 'related', JOIN::WITH, 'related.id = parent.subpart')
->where('model.id = :number')
->setParameter('number', $model->getId())
->andWhere('related.id != :number')
->distinct(true);
return $queryBuilder->getQuery()->getResult();
}
public function count()
{
$queryBuilder = $this->createQueryBuilder('model');
$queryBuilder->select('count(model)');
return $queryBuilder->getQuery()->getSingleScalarResult();
}
/**
* Create new Model entity with $number or retrieve one.
*
* @param $id
*
* @return Model
*/
public function getOrCreate($id)
{
if (($model = $this->findOneBy(['id' => $id])) == null) {
$model = new Model();
$model->setId($id);
}
return $model;
}
}