Doctrine - 在一对多关系中使用FindBy

3
假设我有一个“产品”实体。
/**
* @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;

正如您所看到的,产品和产品语言之间存在一对多的连接。

问题是,是否有可能使用Doctrine的“findBy()”方法从“Product”存储库中根据productLang.name查找产品?

我知道我可以做一些类似的事情

productLangRepo->findBy( [ 'product' => $product, 'name' => $name]) 

但我需要留在productRepo中,这意味着我想做类似以下的事情:
productRepo->findBy( [ 'contentLang["iso"]->name' => $name ]) 
2个回答

4
我认为你的方法不太对。你应该在语言库中使用 findBy 方法:
$language = productLangRepo->findBy(array('name' => $name));

然后从连接的产品中获取它们(因为您有双向连接):

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

那么你将拥有一个产品集合,您可以进行过滤。如果您仍想从产品存储库方面进行,则必须使用DQL或Criteria编写更复杂的筛选器。


-2

看起来 QueryBuilder 是唯一的解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接