Php 原则-通过一对多关系查找

Php 原则-通过一对多关系查找,php,doctrine-orm,Php,Doctrine Orm,假设我有“产品”实体 /** * @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(targetEnti

假设我有“产品”实体

/**
* @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));
然后从中获取连接的产品(因为您有双向连接):


然后,您将拥有一个可以筛选的产品集合。如果您仍然想从产品回购的角度出发,则必须使用DQL或Criteria来编写更复杂的过滤器。

看来QueryBuilder是唯一的解决方案

$productsForLanguage = $language->getProduct() //btw since it is many to one it should be named products not product.