Dia*_*blo 10 symfony doctrine-orm symfony-2.5
注意:这是特定于本机查询
我有2个相关的entite " CrmBusinessPartner "和" RefCountry "和" CrmBusinessPartnerRepository "存储库.
CrmBusinessPartner实体
/**
* CrmBusinessPartner
*
* @ORM\Table(name="crm_business_partner")
* @ORM\Entity(repositoryClass="CrmBusinessPartnerRepository")
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
* @ExclusionPolicy("none")
*/
class CrmBusinessPartner
{
/**
*
* @var integer
*
* @ORM\ManyToOne(targetEntity="RefCountry", inversedBy="businessPartners")
* @ORM\JoinColumn(name="ref_country_id", referencedColumnName="id")
*/
private $billingCountry;
}
Run Code Online (Sandbox Code Playgroud)
RefCountry实体
/**
* RefCountry
*
* @ORM\Table(name="ref_country")
* @ORM\Entity
*/
class RefCountry
{
/**
* @ORM\OneToMany(targetEntity="CrmBusinessPartner", mappedBy="billingCountry")
*/
private $businessPartners;
public function __construct()
{
$this->businessPartners= new ArrayCollection();
}
}
Run Code Online (Sandbox Code Playgroud)
在" CrmBusinessPartnerRepository "存储库中有这个工作代码:
$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addEntityResult('Entity\CrmBusinessPartner', 'bp');
$rsm->addFieldResult('bp','id','id');
$rsm->addFieldResult('bp','vat','vat');
$rsm->addFieldResult('bp','business_partner_name','name');
$rsm->addJoinedEntityResult('Entity\RefCountry', 'rc', 'bp', 'billingCountry');
$rsm->addFieldResult('rc','ref_country_name','name');
$em = $this->getEntityManager()
->createNativeQuery('
SELECT
bp.id,
bp.vat,
bp.name AS business_partner_name,
rc.name AS ref_country_name
FROM crm_business_partner bp
LEFT JOIN ref_country rc ON bp.ref_country_id=rc.id
',
$rsm
);
return $em->getResult();
Run Code Online (Sandbox Code Playgroud)
数据库是同步的(根据doctrine:schema:update):
$ php console doctrine:schema:update
Nothing to update - your database is already in sync with the current entity metadata.
Run Code Online (Sandbox Code Playgroud)
这是结果的转储:
array ()
0 =>
object(Entity\CrmBusinessPartner)
private 'id' => int 42
private 'vat' => string '12345678998' (length=11)
private 'name' => string 'Name 1' (length=22)
private 'billingCountry' => null
Run Code Online (Sandbox Code Playgroud)
题:
我不明白为什么billingCountries总是为所有entites null?
编辑:
我已经有了QueryBuilder的工作解决方案:
$qb = $this->getEntityManager()->createQueryBuilder('bp');
$qb->select(array('bp'));
$qb->from('AppBundle:CrmBusinessPartner', 'bp');
$qb->leftJoin('bp.billingCountry', 'rc');
return $qb->getQuery()->getResult();
Run Code Online (Sandbox Code Playgroud)
编辑2:
" CrmBusinessPartnerRepository "存储库使用ResultSetMappingBuilder而不是ResultSetMapping,这是一个工作代码:
$rsm = new ResultSetMappingBuilder($this->getEntityManager());
$rsm->addRootEntityFromClassMetadata(
'Entity\CrmBusinessPartner',
'bp'
);
$rsm->addJoinedEntityFromClassMetadata(
'Entity\RefCountry',
'rc',
'bp',
'billingCountry',
array(
'id' => 'billing_country_id',
'name'=>'rc_name'
)
);
$em = $this->getEntityManager()
->createNativeQuery('
SELECT
bp.id,
bp.vat,
bp.name AS business_partner_name,
rc.name AS ref_country_name
FROM crm_business_partner bp
LEFT JOIN ref_country rc ON bp.ref_country_id=rc.id
',
$rsm
);
return $em->getResult();
Run Code Online (Sandbox Code Playgroud)
结果是相同的billingCountry对所有实体都是空的:
array ()
0 =>
object(Entity\CrmBusinessPartner)
private 'id' => int 42
private 'vat' => string '12345678998' (length=11)
private 'name' => string 'Name 1' (length=22)
private 'billingCountry' => null
Run Code Online (Sandbox Code Playgroud)
我想知道为什么/如何(不)使用Native Query工作/做(它)?
Dia*_*blo 15
好吧,好吧......看起来你必须添加rc.id AS ref_country_id,查询并$rsm->addFieldResult('rc','ref_country_id','id');像这样:
$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addEntityResult('Entity\CrmBusinessPartner', 'bp');
$rsm->addFieldResult('bp','id','id');
$rsm->addFieldResult('bp','vat','vat');
$rsm->addFieldResult('bp','business_partner_name','name');
$rsm->addJoinedEntityResult('Entity\RefCountry', 'rc', 'bp', 'billingCountry');
$rsm->addFieldResult('rc','ref_country_id','id');
$rsm->addFieldResult('rc','ref_country_name','name');
$em = $this->getEntityManager()
->createNativeQuery('
SELECT
bp.id,
bp.vat,
bp.name AS business_partner_name,
rc.id AS ref_country_id,
rc.name AS ref_country_name
FROM crm_business_partner bp
LEFT JOIN ref_country rc ON bp.ref_country_id=rc.id
',
$rsm
);
return $em->getResult();
Run Code Online (Sandbox Code Playgroud)
它正如预期的那样工作.
我希望有人告诉过我(Doctrine文档......看着你):D
| 归档时间: |
|
| 查看次数: |
12195 次 |
| 最近记录: |