bastien
bastien

Reputation: 444

findBy() foreignKey is not working

There is a relationship between the rubric and brand table (Many rubric to One brand).

Here is my code

    $dbChoices = $this->getConfigurationPool()
        ->getContainer()
        ->get('Doctrine')
        ->getManager()
        ->getRepository('RibambelMainBundle:RubricMenu')
        ->findBy(array('brand_id' => 2));

Everytime this part is run, I got the following error:

Unrecognized field: brand_id

The brand_id column is found in the rubric table. enter image description here

Anyone who can help me with this or show me another way of doing it?

class RubricMenu
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="Title", type="string", length=255)
     */
    private $title;

    /**
     * @var int
     *
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

    /**
     * @ORM\ManyToOne(targetEntity="Brand")
     * @ORM\JoinColumn(name="brand_id", nullable=false)
     */
    private $brand;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $title
     *
     * @return RubricMenu
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set position
     *
     * @param integer $position
     *
     * @return RubricMenu
     */
    public function setPosition($position)
    {
        $this->position = $position;

        return $this;
    }

    /**
     * Get position
     *
     * @return int
     */
    public function getPosition()
    {
        return $this->position;
    }


    /**
     * Set brand
     *
     * @param \Ribambel\MainBundle\Entity\Brand $brand
     *
     * @return RubricMenu
     */
    public function setBrand(\Ribambel\MainBundle\Entity\Brand $brand = null)
    {
        $this->brand = $brand;

        return $this;
    }

    /**
     * Get brand
     *
     * @return \Ribambel\MainBundle\Entity\Brand
     */
    public function getBrand()
    {
        return $this->brand;
    }
}

Upvotes: 5

Views: 6168

Answers (3)

Alan T.
Alan T.

Reputation: 1430

Searching by a foreign key simply does not make sense from an object point of view. brand_id is not a field of your RubricMenu entity, brand is.

If you have a Brand entity, then you can use findBy (or the magic method findByBrand) like this: (with $myBrand an instance of Brand)

$repository->findBy(['brand' => $myBrand]);
// OR
$repository->findByBrand($myBrand);

If you simply have the id of your target entity, you can use the IDENTITY DQL function but in that case you cannot use findBy directly as it expects a valid field name. Thus, you will need to add a method in your RubricMenu repository. Your method could look like this:

public function findByBrandId($brandId)
{
    $qb = $this->createQueryBuilder('rm');
    $qb->where('IDENTITY(rm.brand) = :brandId')
       ->setParameter('brandId', $brandId);

    return $qb->getQuery()->getResult();
}

On a side note, as pointed out by @l.g.karolos's answer, doing

$repository->findBy(['brand' => $brandId]);
// OR
$repository->findByBrand($brandId);

will also work as the findBy method internals will be able to resolve that the given parameter is an ID of a Brand entity, thus it will produce the same query as if you had given the corresponding Brand instance.

Upvotes: 8

Romain Norberg
Romain Norberg

Reputation: 1067

i thing you can do:

$dbChoices = $this->getConfigurationPool()
        ->getContainer()
        ->get('Doctrine')
        ->getManager()
        ->getRepository('RibambelMainBundle:RubricMenu')
        ->findBy(array('brand' => $brand));

if you have $brand object (...\Entity\Brand)


Example on https://www.wanadev.fr/56-comment-realiser-de-belles-requetes-sql-avec-doctrine/ :

$user = …;
$category = …;

$em = $this->container->get("doctrine.orm.default_entity_manager");
$entities = $em->getRepository(MyClass::class)->findBy([
    "user" => $user,
    "category" => $category,
]);

Upvotes: 0

l.g.karolos
l.g.karolos

Reputation: 1142

Based on your entity you should do the following.

$dbChoices = $this->getConfigurationPool()
        ->getContainer()
        ->get('Doctrine')
        ->getManager()
        ->getRepository('RibambelMainBundle:RubricMenu')
        ->findBy(array('brand' => 2));

Upvotes: 6

Related Questions