symfony - 从实体及其关系中选择特定字段
问题描述
我有许多实体与它的关系,并且由于优化 REST 调用以仅选择我实际上也需要与实体关系的这个字段。所以,我有这样的实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\DocumentRepository")
* @ORM\Table(name="document_types")
*/
class DocumentType
{
use RestDefaultsTrait;
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
* @Serializer\Groups({"main-document-type"})
*/
private $id;
/**
* @ORM\Column(type="string", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $slug;
/**
* @ORM\Column(type="string", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $symbol;
/**
* @ORM\Column(type="string")
* @Serializer\Groups({"main-document-type"})
*/
private $name;
/**
* @ORM\Column(type="string", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $description;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $canBeGenerated;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $inEmployer;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $inWorker;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $inAll;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $isAnnex;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*
*
*/
private $isAttachment;
/**
* @ORM\ManyToOne(targetEntity="DocumentType", inversedBy="childDocuments")
* @Serializer\Groups({"main-document-type"})
*/
private $parentDocument;
/**
* @ORM\OneToMany(targetEntity="DocumentType", mappedBy="parentDocument")
* @Serializer\Groups({"main-document-type"})
*
*/
private $childDocuments;
/**
* @ORM\Column(type="string", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $annexNumberStart;
/**
* @ORM\ManyToOne(targetEntity="ProfessionGroup", inversedBy="documentTypes")
* @Serializer\Groups({"main-document-type"})
*/
private $professionGroup;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $isNumbering;
/**
* @ORM\Column(type="array", nullable=true)
*/
private $employmentGroup = [];
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $canNumberBeSuggested = false;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Serializer\Groups({"main-document-type"})
*/
private $canBeEdited = false;
}
在实体存储库中,我想做这样的事情:
public function getDocuments( $filterData )
{
$select = [
// 'id' => 'id',
'slug' => 'slug',
'name' => 'name',
'isAnnex' => 'is_annex',
'canNumberBeSuggested' => 'can_number_be_suggested',
'canBeEdited' => 'can_be_edited',
];
$childDocumentsSelect = [
'id' => 'id',
'name' => 'name',
];
$qb = $this->createQueryBuilder( 'document' )
->where( 'document.canBeGenerated = 1' )
;
$qb->select( 'document.id AS id' );
foreach ( $select as $selectField => $selectValue )
{
$qb->addSelect( sprintf( 'document.%s AS %s', $selectField, $selectValue ) );
}
$qb->join( 'document.childDocuments', 'childDocuments' );
foreach ( $childDocumentsSelect as $selectField => $selectValue )
{
$qb->addSelect( sprintf( 'childDocuments.%s AS %s', $selectField, $selectValue ) );
}
return $qb->getQuery()->getResult();
}
在结果中,我想从$select
数组和子文档数组中接收基本字段,$childDocumentsSelect
仅在此示例中具有选定字段,id
并且name
甚至可能吗?有时我的实体有 3 个关联,有时没有。目前我正在使用序列化程序,但想优化它
解决方案
试试我的例子,我认为这就是你所需要的。
$qb = $this->createQueryBuilder( 'document' );
$qb->select([
'document.slug',
'document.name',
'document.isAnnex',
'document.canNumberBeSuggested',
'document.canBeEdited',
'childDocument.id',
'childDocument.name'
])
->leftJoin('documnet.childDocuments', 'childDocument')
->where('document.canBeGenerated = 1');
$queryResult = $qb->getQuery()->getResult();
$items = [];
foreach($queryResult as $item) {
$id = $item['id'];
if (!isset($items[$id])) {
$items[$id]['id'] = $id;
}
$items[$id]['child'][] = [
'slug' => $item['name']
];
}
var_dump($items);
推荐阅读
- reactjs - 如何在谷歌地图上添加自定义控件?
- laravel - Dataclip 错误错误:无法在只读事务中执行 INSERT
- reactjs - 尝试使用等待时得到“意外的严格模式保留字”
- css - 使引导卡水平显示
- maya - 将菜单栏添加到 VFB 窗口 - maya 2018
- opengl-es - 从 ARCore 示例应用程序中,如何绘制面部网格线?
- angularjs - AngularJS如何使用菜单为整个应用程序实现面包屑
- progress-bar - 使用 Inno Setup 安装文件时显示进度详细信息(如速度)
- c++ - C ++稳定时钟返回0时间,有时?
- asp.net - DropdownList 在移动设备上不起作用