ApiGility - 返回自定义集合

时间:2014-12-19 17:34:40

标签: php zend-framework2 apigility

我的目标是返回findAll()查询的自定义集合,并将其传递给HAL,以确保其_links格式正确。我原本以为我会以编程方式执行此操作,但这似乎是错误的做法。

我面临的问题是我需要的数据不是来自单个表,而是来自多个表(连接),我无法确定如何正确地执行此操作。

我有以下实体:

石头实体:一个标准表,其中包含我想要在Feed中返回的某些属性的连接

/**
     * @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

正如您在屏幕截图中看到的那样,“属性”和其他类似字段未被填充......

所以我的问题是:如何确保在Feed中填充连接表?

1 个答案:

答案 0 :(得分:0)

您需要获取加入您的关联。您可以在Doctrine 2文档 here 中阅读此内容。

在您的情况下,它看起来如下:

$qb = $this->stoneRepository->createQueryBuilder('s')
    ->addSelect('a')
    ->leftJoin('s.attribute', 'a')
    ->where('s.state = :state')
    ->setParameter('state' , 1 );

还需要为StAttribute中的MetadataMap添加一个保护程序,否则应该实施一些代码来提取StAttribute属性。

您当然也可以在fetch方法本身中执行此操作,但这并不是那么漂亮。

如果您没有将对象提取或转换为可以序列化为有效json格式({}资源或集合实例,a的对象,则对象将继续呈现为Hal json)字符串或JsonSerializable)。