Php 在多通关联中处理2个实体时,如何使用条令选择记录子集?
我想找到一种方法,使用ORM(比如我的案例中的条令)正确地选择记录的子集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
$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。