我的目标是返回findAll()
查询的自定义集合,并将其传递给HAL,以确保其_links
格式正确。我最初以为我会简单地以编程方式执行此操作,但这似乎是错误的方法。
面临的问题是我需要的数据不是来自单个表,而是来自多个表(连接(,我无法弄清楚如何正确执行此操作。
我有以下实体:
石头实体:一个标准表,其中包含我想在提要中返回的某些属性的联接
/**
* @var integer
*
* @ORM'Column(name="id", type="integer", nullable=false)
* @ORM'Id
* @ORM'GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM'ManyToMany(targetEntity="Stone'Entity'StAttribute")
* @ORM'JoinTable(name="st_stone_attribute",
* joinColumns={@ORM'JoinColumn(name="stone_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM'JoinColumn(name="attribute_id", referencedColumnName="id")}
* )
*
* @var Collection
* @access private
*/
private $attribute;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=50, nullable=false)
*/
private $name;
etc...
属性实体是标准表:
/**
* @var integer
*
* @ORM'Column(name="id", type="integer", nullable=false)
* @ORM'Id
* @ORM'GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=30, nullable=false)
*/
private $name;
我的资源调用:
public function fetchAll($params = array())
{
return $this->stoneMapper->fetchAll();
}
我的映射器文件:
public function fetchAll()
{
$qb = $this->stoneRepository->createQueryBuilder('u')
->where('u.state=:state')
->setParameter('state' , 1 );
$adapter = new DoctrineAdapter( new ORMPaginator( $qb ) );
$collection = new StoneCollection($adapter);
return $collection;
}
我的收藏
use Zend'Paginator'Paginator;
class StoneCollection extends Paginator
{
}
此处的结果屏幕截图:http://screencast.com/t/vgm34s92dsk2
从屏幕截图"属性"和其他类似字段中看到,没有填充...
所以我的问题是:如何确保在提要中填充联接表?
您需要获取加入您的关联。您可以在此处的教义 2 文档中阅读有关此内容的内容。
在您的情况下,它如下所示:
$qb = $this->stoneRepository->createQueryBuilder('s')
->addSelect('a')
->leftJoin('s.attribute', 'a')
->where('s.state = :state')
->setParameter('state' , 1 );
还需要在MetadataMap
中为您的StAttribute
安装水化器,或者应该实现一些代码来提取StAttribute
属性。
当然,您也可以在 fetch 方法本身中执行此操作,但这并不那么漂亮。
如果您不提取对象或将对象转换为可序列化为有效 json 格式的内容(Hal
资源或集合实例、(json( 字符串或JsonSerializable
(,则对象将继续呈现为{}
。