0

所以,我们有两个实体。一个有存储库,另一个没有。当我们试图从另一个表中获取数据时,我们将获取 ArrayCollection 数据。问题是如何调用这个实体存储库方法?这是真的吗?

例子:

    $system = $this
            ->getDoctrine()
            ->getEntityManager()
            ->getRepository('SomeBundle:FirstEntity')
            ->findOneByColumnID($id);

    $den = $system->getDataFromSecondTable(); // ArrayCollection of SecondEntity

然后我想使用某种:

    $den[0]->functionFromSecondEntityRepository();

因此,方法“functionFromSecondEntityRepository”位于 SecondEntity 类的存储库中,我无法调用它 - 未定义方法调用“functionFromSecondEntityRepository”时出错。

那么我怎样才能以正确的方式做到这一点?

4

2 回答 2

1

您没有提供太多细节,所以我将在这里举一些例子。

假设您有一个 EntityFriendsListOne-to-Many与 Entity 的关系Friend

$List = $this->getDoctrine()
                ->getEntityManager()
                ->getRepository('SomeBundle:FriendsList')
                ->find($id);

// The list you pulled in by ID can now be used
$List->getId();

foreach($List->getFriends() as $Friend)
{
    // Each friend will be output here, you have access
    // to the Friend methods now for each.
    $Friend->getId();
    $Friend->getFirstName();
    $Friend->getLastName();
    $Friend->getDOB();
    $Friend->getFavoriteColor();
}

默认情况下,当您创建关系时,会创建一个获取集合的方法,在此示例getFriends中,它返回一个实体数组。生成实体后,查看您的实体模型以查看哪些方法可用。默认情况下,会为实体中的每个属性创建一个,并为集合创建其他属性。

SomeCool/Bundle/Entity/FriendsList
Somecool/Bundle/Entity/Friend

如果您使用 YAML 配置,以下是一对多关系的样子。

SomeCool\Bundle\Entity\FriendsList:
  type: entity
  table: null
  oneToMany:
    friend:
      targetEntity: Friend
      mappedBy: friendslist
      cascade:  ["persist"]

SomeCool/Bundle/Entity/Friend
  manytoOne:
    friends:
      targetEntity: FriendsList
      mappedBy: friend
      cascade:  ["persist"]

访问存储库

YAML 配置 (services.yml)

somebundle.bundle.model.friends:
    class: SomeBundle/Bundle/Model/Friends
    arguments: [@doctrine.orm.entity_manager]

在控制器上

$friendsModel = $this->get('somebundle.bundle.model.friends');
$Friends = $friendsModel->findByFirstName('Bobby');

foreach($Friends as $Friend)
{
    $Friend->getLastName();
}
于 2013-01-14T13:47:37.453 回答
0

存储库方法在实体中不可用。您需要在您的 AnotherEntity 中使用一个函数来获取 ArrayCollection。IE:

class FirstEntity {

   public function getAnotherEntity()
   {
       return $this->anotherEntity;
   }

}

class AnotherEntity 
{
   public function getArrayCollection()
   {
       return $this->myArrayCollection;
   }
}

$firstEntity->getAnotherEntity()->getArrayCollection();

另一种选择是根据第一个结果获取另一个实体的存储库:

$system = $this
        ->getDoctrine()
        ->getEntityManager()
        ->getRepository('SomeBundle:SomeEntity')
        ->findOneByColumnID($id);

$anotherEntity = $system->getAnotherEntity();

$anotherEntityResult = $this->getDoctrine()
                            ->getRepository(get_class($anotherEntity))
                            ->functionFromAnotherEntityRepository($anotherEntity->getId());

如果使用第二种解决方案,我会确保 $anotherEntity 在尝试检索存储库之前不为空。

于 2013-01-14T13:38:55.270 回答