Ich bin sehr neu in Symfony, komme aus einem Kohana-Hintergrund und habe eine harte Zeit, mich an Doctrine zu gewöhnen.Übergeht createQueryBuilder von Doctrine die Getter-Methoden von Entities?
Zur Zeit habe ich eine Produkttabelle, die ich innerlich einige andere Tabellen mit dem createQueryBuilder verbinden und einige zusätzliche Logik in der Getter-Methode für die Produkt-Entität hinzufügen muss. Es scheint jedoch, dass die Getter-Methoden nicht einmal verwendet werden. Hier einige Auszüge aus meinen Code:
//From AppBundle\Controller\ProductController
$repository = $this->getDoctrine()->getRepository('AppBundle:Product');
$products = $repository->findWithLimitNew(24);
//From AppBundle\Repositories\ProductRepository
public function findWithLimitNew($limit=1)
{
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
$qb->select('p.name', 'p.id', 'p.slug', 'pc.name AS catname')
->from('AppBundle\Entity\Product', 'p')
->innerJoin(
'AppBundle\Entity\ProductAttributes',
'pa',
\Doctrine\ORM\Query\Expr\Join::WITH,
'p.id = pa.productId'
)
->innerJoin(
'AppBundle\Entity\ProductCategories',
'pc',
\Doctrine\ORM\Query\Expr\Join::WITH,
'pa.value = pc.id'
)
->where('pa.type = 1')
->where('pa.default = 1')
->setMaxResults($limit);
return $qb->getQuery()->getResult();
}
// From AppBundle\Entity\Product
/**
* Get name
*
* @return string
*/
public function getName()
{
#return $this->name; //<--Commenting this out for now
return 'Some stupid string';
}
// From index.twig.html
{% for product in products %}
<h1>{{product.name}}</h1>
{% endfor %}
Nun, wie Sie sehen, kann ich die Getter-Methode getName() haben einen String zurückkehrt, aber wenn die Ansicht gerendert wird ich den Produktnamen, nicht die Zeichenfolge ich bin Rückkehr. Was gibt?
Wie Sie vermuteten, verwendet Doctrine 2 beim Hydratisieren einer Entität (d. H. Beim Abrufen aus der Datenbank) Reflektion, um die Entitätseigenschaften direkt festzulegen. Alle Methoden (einschließlich des Konstruktors) werden ignoriert. Und DQL ist nicht SQL. Ich bin überrascht, dass Ihre Anfrage überhaupt etwas zurückgibt. – Cerad
@Cerad Meine Abfrage kommt von einer Doctrine-Website und die Abfrage funktioniert einwandfrei. Natürlich habe ich meine Tabellennamen geändert. – pogeybait
Ist Ihr "Name" -Feld in AppBundle \ Entity \ Product als öffentlich markiert? Wenn das der Fall ist, könnte es daran liegen, dass Zweig sieht, dass die Eigenschaft öffentlich ist und sich nicht damit beschäftigt, den Getter aufzurufen. Versuchen Sie es privat zu machen und lassen Sie den Getter als öffentlich – valepu