Php 在多通关联中处理2个实体时,如何使用条令选择记录子集?

Php 在多通关联中处理2个实体时,如何使用条令选择记录子集?,php,orm,doctrine-orm,doctrine,Php,Orm,Doctrine Orm,Doctrine,我想找到一种方法,使用ORM(比如我的案例中的条令)正确地选择记录的子集 $rep = $this->entityManager->getRepository('Entity\ServiceLineItem'); $serviceItems = $rep->findBy(...); 在本例中,我希望选择具有“Testing”的$serviceType的ServiceLineItem的所有实例 在我的代码中,我创建了以下两个实体: /** @Entity */ class Se

我想找到一种方法,使用ORM(比如我的案例中的条令)正确地选择记录的子集

$rep = $this->entityManager->getRepository('Entity\ServiceLineItem');
$serviceItems = $rep->findBy(...);
在本例中,我希望选择具有“Testing”的
$serviceType
的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理论相当于

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'
));
我正在寻找一种方法来避免使用底层数据库索引,并使用更高级别的构造,例如实际值(即“测试”)。在条令中如何做到这一点?

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

见:

当前方法 在这种情况下,必须使用查询。使用
$em->createQuery()或内置的QueryBuilder:

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

    /**
     * @Entity(repositoryClass="Repository\ServiceLineItemRepository")
     */
    
  • 使用查找方法创建存储库:

    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();
        }
    }
    


  • !!一切都没有经过测试

    好的,谢谢!所以没有“简单”的方法。。。我在其他地方看到过创建自定义DQL片段,但我认为有一种方法可以让ORM为您进行简单的连接,而无需指定自定义DQL。我有点想删除关联并创建一个表(就像将我的“serviceType”类别拉入“ServiceLineItem”本身并删除外键、关联等),或者只使用两个存储库方法—拉入serviceType,获取其索引,将该索引输入ServiceLineItem。我在寻找更简单的方法。。如果有的话。(也就是说没有DQL。但我会尽我所能..好吧,没有更简单的方法了。我建议使用自定义DQL。这样,您只需向服务或控制器类注入一个存储库实例。存储库的工作是获取请求的结果及其依赖项。使用双存储库方法,您可以必须在应用程序中添加另一层以严格遵循单一责任原则。无论如何,我看不出有任何理由不使用DQL。