ApiGility - 返回自定义集合


ApiGility - Returning custom collections

我的目标是返回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(,则对象将继续呈现为{}