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!

  • 2017-08-25 Diego Aguiar

    Totally! and the best part (at least to me) is, it works with refactoring tools

  • 2017-08-25 Jacob

    Yeah, using the Genus::class is much better than the 'AppBundle:Genus' magic string.

  • 2017-08-14 Victor Bocharsky

    Hey Luka,

    Well, it's in case your want to print the dump output, but... you probably don't :) Because it's printed not on the page but in the Symfony Web Debug Toolbar - look for the "target" icon. Or, you can click on this icon and you will be redirected to the "Dumped Contents" tab of profiler where your dump output will be expanded full page. I bet you just missed it, that's why you think it doesn't work. Dump's output is printed on the page only when you use it in Twig templates.

    Cheers!

  • 2017-08-13 Luka Sikic

    I actually had to use "return new Response(dump($genuses));" to make it working.

  • 2017-03-20 Victor Bocharsky

    Hey Honey,

    There's a third-party bundle: DoctrineMongoDBBundle. It helps you to use Symfony with Mongo DB. You have to install this bundle with Composer. Unfortunately, we have not had a screencast about this bundle yet - it's only in our plans, but you can take a look at their official docs to get started with it quickly: https://symfony.com/doc/cur...

    Cheers!

  • 2017-03-20 Honey

    hi weaverryan
    can u tell me how can i connect my symfony3 with mongodb i am new to this technologies

  • 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/sc...

  • 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/prin...

  • 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. (?)