2017-08-31 3 views
0

Ich habe MoneyChanger Entität, die viele-zu-viele Beziehung mit AddTransaction Einheit hat.Symfony Doctrine Viele-zu-viele Daten holen

Ich möchte alle Zeilen von AddTransaction Entität erhalten, die MoneyChanger Entity gehört.

Hier sind die Strukturen meiner Tabellen.

MoneyChanger Tabl

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

money_changer_add_transaction Tabl

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

add_transaction Tabl

id 
--- 
1 
2 
3 
4 
5 

Hier ist, was ich bisher gemacht habe, aber ich habe kein Glück.

$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>"; 
       } 
      } 

Hier ist die Geldwechsler Entity

/** 
* @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(); 
    } 

Hier ist die AddTransaction Entity

/** 
* @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(); 
    } 

Fehler:

Class MontealBundle\Entity\MoneyChanger has no association named money_changer_add_transaction

+0

Welche Fehler haben Sie abrufen? Was erwartest du und was beschaffst du? –

+0

Ich habe diesen Fehler 'Klasse MontealBundle \ Entity \ MoneyChanger hat keine Zuordnung namens money_changer_add_transaction' – phpmeter

+0

Bitte zeigen Sie uns die Entität MoneyChanger bitte –

Antwort

0

versuchen, diese ;

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

Ich bekomme nicht die ID von AddTransaction Tabelle. Was ich bekommen will, ist die Zeile von moneyChanger, dann die Zeile von addTransaction, wenn sie einen Datensatz enthält. die Zeile, die ich bekomme, ist immer noch von money_changer – phpmeter

+0

versuchen Sie mit einem leftJoin bitte @ phpmeter –

+0

Ich bekomme immer noch den Rekord von 'money_changer' tbl. – phpmeter

0

Um die damit verbundenen Transaktionen für Ihre bekommen MoneyChanger Ihre erste Query Builder ist in Ordnung Objekt, das Sie MoneyChanger Objekte gibt, wenn Sie eine Schleife durch diese Aufzeichnungen gibt es keine Notwendigkeit Query Builder ist wieder ausführen, um die im Zusammenhang AddTransaction Objekte, da jeder zu holen MoneyChanger Objekt wird eine Sammlung von verwandten AddTransaction Objekte haben, müssen Sie nur durch wie

auf AddTransaction Objekte die Getter-Methode und Schleife aufrufen
$records = $query->getResult(); 
foreach ($records as $record) { 
    /* your other code */ 
    $transactions = $record->getAddTransaction(); 
    foreach ($transactions as $trans) { 
     echo "</b>".$trans->getId()."</b></br>"; 
    } 

} 

auch sicherstellen, dass Ihre MoneyChanger Klasse sollte die folgenden Verfahren festlegen, mit dem ArrayCollection verwandter AddTransaction Objekte haben

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

Referenz 5.9. Many-To-Many, Bidirectional