标题和品牌表之间存在关系(许多标题为一个品牌)。
这是我的代码
$dbChoices = $this->getConfigurationPool()
->getContainer()
->get('Doctrine')
->getManager()
->getRepository('RibambelMainBundle:RubricMenu')
->findBy(array('brand_id' => 2));
每次运行此部件时,都会出现以下错误:
无法识别的字段:brand_id
任何可以帮助我的人或者告诉我另一种方法吗?
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;
}
}
答案 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,
]);