[英]Doctrine - FindBy on One To Many relation
假设我有“产品”实体
/**
* @ORM\Entity
* @ORM\Table(name="es_product")
*/
class Product extends \Kdyby\Doctrine\Entities\BaseEntity {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private $id;
...
/**
* @ORM\OneToMany(targetEntity="ProductLang", mappedBy="product", cascade={"ALL"}, indexBy="iso")
*/
protected $contentLang;
...
和ProductLang实体
/**
* @ORM\Entity
* @ORM\Table(name="es_product_lang")
*/
class ProductLang extends \Kdyby\Doctrine\Entities\BaseEntity {
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="\App\Modules\CmsAdmin\Model\Lang")
*/
protected $lang;
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Product", inversedBy="contentLang")
*/
protected $product;
/**
* @ORM\Column(type="string")
*/
protected $name;
如您所见,Product和ProductLang之间存在一对多连接
问题是,是否有可能使用“产品”存储库中的学说的“ findBy()”方法来基于productLang.name查找产品?
我知道我可以做类似的事情
productLangRepo->findBy( [ 'product' => $product, 'name' => $name])
但是我需要留在productRepo中,这意味着我想做些类似的事情
productRepo->findBy( [ 'contentLang["iso"]->name' => $name ])
我认为您正在以错误的方式进行处理。 您应该做的是在语言存储库上使用findBy:
$language = productLangRepo->findBy(array('name' => $name));
然后从中获取连接的产品(因为您有2路连接):
$productsForLanguage = $language->getProduct() //btw since it is many to one it should be named products not product.
然后,您将可以过滤产品集合。 如果您仍然想从产品回购的角度出发,则必须使用DQL或Criteria编写更复杂的过滤器。
看起来QueryBuilder只是解决方案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.