findBy()foreignKey无效

时间:2018-01-29 13:49:16

标签: symfony doctrine-orm

标题和品牌表之间存在关系(许多标题为一个品牌)。

这是我的代码

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

每次运行此部件时,都会出现以下错误:

  

无法识别的字段:brand_id

brand_id列位于量表中。 enter image description here

任何可以帮助我的人或者告诉我另一种方法吗?

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

3 个答案:

答案 0 :(得分:6)

根据您的实体,您应该执行以下操作。

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

答案 1 :(得分:4)

从对象的角度来看,通过外键搜索根本没有意义。 brand_id不是RubricMenu实体的字段,brand是。

如果您有Brand实体,则可以使用findBy(或魔术方法findByBrand),如下所示:( $myBrand个实例{{1 }})

Brand

如果您只是拥有目标实体的ID,则可以使用$repository->findBy(['brand' => $myBrand]); // OR $repository->findByBrand($myBrand); DQL函数,但在这种情况下,您不能直接使用IDENTITY,因为它需要有效的字段名称。因此,您需要在findBy存储库中添加方法。您的方法可能如下所示:

RubricMenu

在附注中,正如@ l.g.karolos的回答所指出的,

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

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

也可以工作,因为$repository->findBy(['brand' => $brandId]); // OR $repository->findByBrand($brandId); 方法内部将能够解析给定参数是findBy实体的ID,因此它将产生相同的查询,就像您给出相应的一样Brand实例。

答案 2 :(得分:0)

我可以做的事情:

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

如果您有$brand个对象(...\Entity\Brand

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,
]);