在ManyToOne Association中使用2个实体时,如何使用Doctrine选择记录子集?

时间:2015-10-01 15:38:48

标签: php orm doctrine-orm doctrine

我想找到一种方法,在我的案例中使用ORM正确选择记录子集,例如Doctrine。

$rep = $this->entityManager->getRepository('Entity\ServiceLineItem');
$serviceItems = $rep->findBy(...);

在我的情况下,我想选择具有$serviceType“Testing”的所有ServiceLineItem实例。

在我的代码中,我创建了以下两个实体:

/** @Entity */
class ServiceLineItem
{
    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;

    /**@ManyToOne(targetEntity="ServiceType") */
    private $serviceType;

    /** @Column(length=255) */
    private $description;
}

/** @Entity */
class ServiceType
{

    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;

    /** @Column(length=255)*/
    private $serviceType;
}

我的数据库如下所示:

serviceLineItem(id INT, serviceType_id INT, description VARCHAR);
serviceType(id INT, serviceType VARCHAR);

我正在寻找相当于

的PHP ORM Doctrine
select * 
from ServiceLineItem 
join ServiceType on ServiceLineItem.ServiceType_id = ServiceType.id
where ServiceType.name = "Testing";

目前我正在使用

$serviceItems = $rep->findBy(array(
     //"Testing" has an index of 1 in the database table
    'serviceType' => '1'
));

我正在寻找一种方法来避免使用底层数据库索引并使用更高级别的结构,例如实际值(即“测试”)。我怎么能在Doctrine中做到这一点?

1 个答案:

答案 0 :(得分:0)

单表继承

也许你正在寻找Single Table Inheritance。在这种情况下,对于由指定列“区分”的单个表,您有不同的模型类。

请参阅:

目前的方法

在这种情况下,您必须使用DQL查询。使用$em->createQuery(<query>);或内置的QueryBuilder:

  1. 通过扩展模型的注释来使用自定义存储库:

    /**
     * @Entity(repositoryClass="Repository\ServiceLineItemRepository")
     */
    
  2. 使用find方法创建存储库:

    class ServiceLineItemRepository extends \Doctrine\ORM\EntityRepository
    {
        public function findByServiceType($serviceType)
        {
            $queryBuilder = $this->_em->createQueryBuilder('item');
    
            if ($serviceType instanceof ServiceType) {
                $queryBuilder->where('item.serviceType = :type')
                    ->setParameter('type', $serviceType);
            } else {
                $queryBuilder->innerJoin('item.serviceType', 'type')
                    ->where('type.serviceType = :type')
                    ->setParameter('type', $serviceType);
            }
    
            return $queryBuilder->getQuery()->getResult();
        }
    }
    
  3. <强> !!一切都未经测试!!