2017-08-31 16 views
0

私はMoneyChangerAddTransactionエンティティと多対多の関係を持つエンティティを持っています。Symfony Doctrine多対多フェッチデータ

AddTransactionに属するすべての行を取得したいMoneyChangerエンティティに属するエンティティ。

ここに私のテーブルの構造があります。

MoneyChanger

id 
--- 
1 
2 
3 
4 
5 

TBL

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

add_transaction TBL tblが

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

money_changer_add_transactionここで私がこれまで行ってきたが、私は運を持っていないものです。

$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

このエラーが発生しました 'Class MontealBundle \ Entity \ MoneyChangerにmoney_changer_add_transactionという名前のアソシエーションがありません。 – phpmeter

+0

エンティティを表示してくださいMoneyChanger please –

答えて

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あなたの最初のクエリビルダオブジェクトのための関連する取引を取得するには、各ので、関連AddTransactionオブジェクトをフェッチするために、再度クエリビルダを実行する必要がないときにループこれらのレコードを通してあなたにMoneyChangerオブジェクトを与える結構ですMoneyChangerオブジェクトは、関連AddTransactionオブジェクトのコレクションを持って、あなただけのもあなたのを確認してください

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

} 

ようAddTransactionオブジェクト上を通じてgetterメソッドとループを呼び出す必要がありますクラスは、関連するオブジェクトAddTransaction

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

リファレンス5.9. Many-To-Many, Bidirectional

関連する問題