2017-08-31 150 views
0

我有MoneyChangerAddTransaction实体有多对多关系的实体。Symfony Doctrine多对多取数据

我想从属于MoneyChanger实体AddTransaction实体获取所有行。

这里是我的表的结构。

MoneyChanger TBL

id | created_at 
---------------- 
1 | 2017-08-28 
2 | 2017-08-28 
3 | 2017-08-28 

money_changer_add_transaction TBL

money_changer_id: | add_transaction_id 
--------------------------------------- 
     1   |  1 
--------------------------------------- 
     1   |  2 
--------------------------------------- 
     1   |  3 
--------------------------------------- 
     2   |  4 
--------------------------------------- 
     3   |  5 

add_transaction TBL

id 
--- 
1 
2 
3 
4 
5 

这是我到目前为止已经完成,但我有没有运气。

$em = $this->getDoctrine()->getManager(); 

      $repository = $em->getRepository('MontealBundle:MoneyChanger'); 
      $query = $repository->createQueryBuilder('p') 
        ->where('p.createdAt BETWEEN :startDate AND :endDate') 
        ->andWhere('p.type = :type') 
        ->setParameter('startDate', $startDate) 
        ->setParameter('endDate', $endDate) 
        ->setParameter('type', $type) 
        ->getQuery(); 

      $records = $query->getResult(); 

      foreach ($records as $record) { 

       echo "</b>".$record->getId()."</b></br>"; 

       $transactions = $em->getRepository('MontealBundle:AddTransaction'); 
       $qry = $repository->createQueryBuilder('a') 
        ->innerJoin('a.money_changer_add_transaction', 'm') 
        ->where('a.money_changer_id = :money_changer_id') 
        ->setParameter('money_changer_id', $record->getId()) 
        ->getQuery(); 

       $transactions = $qry->getResult(); 

       dump($transactions); 

       foreach ($transactions as $trans) { 
        echo "</b>".$trans->getId()."</b></br>"; 
       } 
      } 

这里的钱币兑换实体

/** 
* @ORM\Entity 
* @ORM\Table(name="money_changer") 
* @ORM\Entity(repositoryClass="MontealBundle\Repository\MoneyChangerRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class MoneyChanger 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="AddTransaction", inversedBy="moneyChanger", cascade={"persist"}) 
    * @ORM\JoinTable(name="money_changer_add_transaction", 
    *  joinColumns={@ORM\JoinColumn(name="money_changer_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="add_transaction_id", referencedColumnName="id", unique=true)} 
    * ) 
    */ 
    private $addTransaction; 

    public function __construct() 
    { 
     $this->addTransaction = new ArrayCollection(); 
    } 

这里是AddTransaction实体

/** 
* @ORM\Entity 
* @ORM\Table(name="add_transaction") 
*/ 
class AddTransaction 
{ 

    /** 
    * @ORM\ManyToMany(targetEntity="MoneyChanger", mappedBy="addTransaction", cascade={"persist"}) 
    * 
    */ 
    private $moneyChanger; 

    public function __construct(){ 
     $this->moneyChanger = new ArrayCollection(); 
    } 

错误:

Class MontealBundle\Entity\MoneyChanger has no association named money_changer_add_transaction

+0

你检索的错误的ArrayCollection?你期望什么和你检索什么? –

+0

我得到了这个错误'类MontealBundle \实体\ MoneyChanger没有关联名为money_changer_add_transaction' – phpmeter

+0

请向我们显示的实体MoneyChanger请 –

回答

0

试试这个;

$qry = $repository->createQueryBuilder('a') 
    ->innerJoin('a.addTransaction', 'm') 
    ->where('a.id = :money_changer_id') 
    ->setParameter('money_changer_id', $record->getId()) 
    ->getQuery(); 
+0

我没有从AddTransaction表中获取id。 我想要得到的是moneyChanger的行,然后是addTransaction的行,如果它有记录的话。 我得到的行仍然是从money_changer – phpmeter

+0

尝试与左加入请@phpmeter –

+0

我仍然从'money_changer' tbl获得记录。 – phpmeter

0

要获得关联交易为您MoneyChanger反对你的第一个查询生成器是好的,让你MoneyChanger对象,当你遍历这些记录没有必要再次运行查询生成器,以获取相关AddTransaction对象,因为每个MoneyChanger对象将有相关AddTransaction对象的集合,你只需要调用通过getter方法和环路上AddTransaction对象,如

$records = $query->getResult(); 
foreach ($records as $record) { 
    /* your other code */ 
    $transactions = $record->getAddTransaction(); 
    foreach ($transactions as $trans) { 
     echo "</b>".$trans->getId()."</b></br>"; 
    } 

} 

另外,还要确保您的MoneyChanger类应该有下面的方法,这将有相关AddTransaction对象

public function getAddTransaction() 
{ 
    return $this->addTransaction; 
} 

参考5.9. Many-To-Many, Bidirectional