2

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

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

我有以下实体:

Stone 实体:一个标准表,其中包含我想在我的提要中返回的一些属性

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

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

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

4

1 回答 1

0

您将需要获取加入您的协会。您可以在此处的 Doctrine 2 文档中阅读此内容。

在您的情况下,它将如下所示:

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

您还需要为您的水合器提供水合器,StAttribute否则MetadataMap应该实施一些代码来提取StAttribute属性。

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

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

于 2016-03-01T13:56:40.393 回答