Buy

Query for a List of Genuses

Woh guys, we can already create new tables, add columns and insert or update data. There's just one big piece left: querying.

Let's create a new page that will show off all the genuses. Create public function listAction() and give it a route path of /genus:

88 lines src/AppBundle/Controller/GenusController.php
... lines 1 - 30
/**
* @Route("/genus")
*/
public function listAction()
{
... lines 36 - 40
}
... lines 42 - 88

Querying? Get the Entity Manager

Remember, everything in Doctrine starts with the all-powerful entity manager. Just like before, get it with $em = $this->getDoctrine()->getManager():

88 lines src/AppBundle/Controller/GenusController.php
... lines 1 - 33
public function listAction()
{
$em = $this->getDoctrine()->getManager();
... lines 37 - 40
}
... lines 42 - 88

To make a query, you'll always start the same way: $genuses = $em->getRepository(). Pass this the class name - not the table name - that you want to query from: AppBundle\Entity\Genus. This gives us a repository object, and hey! He's really good at querying from the genus table. In fact, it's got a bunch of useful methods on it like findAll() and findOneBy. Use findAll():

88 lines src/AppBundle/Controller/GenusController.php
... lines 1 - 33
public function listAction()
{
$em = $this->getDoctrine()->getManager();
$genuses = $em->getRepository('AppBundle\Entity\Genus')
->findAll();
... line 40
}
... lines 42 - 88

What does this return exactly? Um... I don't know - so let's find out! Dump $genuses to see what it looks like:

88 lines src/AppBundle/Controller/GenusController.php
... lines 1 - 37
$genuses = $em->getRepository('AppBundle\Entity\Genus')
->findAll();
dump($genuses);die;
... lines 41 - 88

Back to the browser! Go to /genus... and there's the dump! Ah, it's an array of Genus objects. That makes sense - Doctrine is obsessed with always using objects. And sure, you can make queries that only return some columns, but that's for later.

The AppBundle:Genus Alias

Back to the controller! Now change the Genus class name to just AppBundle:Genus:

88 lines src/AppBundle/Controller/GenusController.php
... lines 1 - 37
$genuses = $em->getRepository('AppBundle:Genus')
->findAll();
... lines 40 - 88

Wait, what? Didn't I say this should be the class name? What is this garbage? It's cool - this is just a shortcut. Internally, Doctrine converts this to AppBundle\Entity\Genus. You can use either form, but usually you'll see the shorter one.... ya know, because programmers are efficient... or maybe lazy.

Leave a comment!

  • 2016-09-28 weaverryan

    we know :) - but probably most people won't. I did "sneak in" one use of "genera" in the fixtures like :) http://knpuniversity.com/scree...

  • 2016-09-27 Maksym Minenko

    It's genera, not genuses. :P

  • 2016-08-03 Victor Bocharsky

    Ah, I think I know what's problem.

    Open "Genus" entity, most probably you have a repository class specified there, right?

    /**
    * @ORM\Table()
    * @ORM\Entity(repositoryClass="AppBundle\Repository\GenusRepository")
    */
    class Genus

    If no - it's weird, then, in PhpStorm, right click on "src/" folder, choose "Find in path" and search for "GenusRepository". PhpStorm will find all usage of GenusRepository class in your code in the src directory and you could remove it.

  • 2016-08-03 James Davison

    Thanks, I really tried everything and even looked at the final file result and everything seems alright. I don't know why it is trying to get this namespace as I am not even calling it...
    Here is a quick print screen:
    http://jamesdavison.io/print-s...

  • 2016-08-03 Victor Bocharsky

    Hey James,

    There is a problem of mapping between your directories and namespaces. You should double-check the namespace of "GenusRepository" class. Is it really has "namespace AppBundle\Repository;" namespace? Is this file really located in "src/AppBundle/Repository/GenusRepository.php" path?

    Also look closely for spelling, maybe you missed some letter or just make a typo in it? Let me know if it doesn't help you.

    Cheers!

  • 2016-08-02 James Davison

    Sorry, just can't make it work, here is the error below, what does it mean?

    Attempted to load class "GenusRepository" from namespace "AppBundle\Repository".

    Did you forget a "use" statement for another namespace?

  • 2016-04-13 weaverryan

    Hey!

    Either way is Ok! You'll start to see this ::class syntax more in Symfony 3 simply because this syntax is new to PHP 5.5, and Symfony 3 is the first version that required PHP 5.5 (so we couldn't show this syntax in the documentation before Symfony 3). But yea, I kinda like this syntax - I think it's a little more "obvious" or understandable than AppBundle:Genus.

    Cheers!

  • 2016-04-08 rchdevel

    Should we use $em->getRepository(Genus::class) to get the repository? I think this is the new sf3 way. (?)