我对一对多关系的学说感到困惑。
问题1:
如果我错了,请纠正我。我假设当我尝试
时$em = $this->getDoctrine()->getManager();
$product_repo = $em->getRepository('MyBundle:Product');
$products = $product_repo->findAll();
dump($products);
我将看到附加到$ features变量的相关功能,所以当我使用$ products-> getFeatures()时,我将以数组形式使用Feature对象。但是从转储调试我没有看到任何附加到它而不是我得到了这个:
另一方面我也这样做
$em = $this->getDoctrine()->getManager();
$feature_repo = $em->getRepository('MyBundle:Features');
$features = $product_repo->findAll();
dump($features);
这次我可以看到Product对象附加到$ product变量。
我的问题是,为什么我无法从变量$ features中获取数据有什么问题吗?或者说,默认情况下,学说不会加载相关数据。
问题2:
如果我们假设数据能够加载到feature $变量中,我是否可以过滤数据(例如,feature.name ='fly'),而不是加载所有相关功能。
=============================================== ===========================
我的演示实体
<?php
use Doctrine\Common\Collections\ArrayCollection;
/** @Entity **/
class Product
{
// ...
/**
* @OneToMany(targetEntity="Feature", mappedBy="product")
**/
private $features;
// ...
public function __construct() {
$this->features = new ArrayCollection();
}
}
/** @Entity **/
class Feature
{
// ...
/**
* @ManyToOne(targetEntity="Product", inversedBy="features")
* @JoinColumn(name="product_id", referencedColumnName="id")
**/
private $product;
// ...
}
产品表(在数据库中): id,description,name
功能表(在数据库中): id,description,name,table_id
答案 0 :(得分:3)
假设您的转储功能是symfony / var-dumper而不是自定义功能
是的,默认情况下,dump函数不会显示嵌套集合,而是关于性能。这不是与学说相关的问题。您的数据已加载到此处。
您可以使用var-dumper的高级用途,例如脚轮(http://symfony.com/doc/current/components/var_dumper/advanced)
您有不同的方法来解决您的问题:
标准更好的解决方案
Product::getFeaturesByName($name='fly'){
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('name', $name));
return $this->features->matching($criteria);
}
过滤强>
Product::getFeaturesByName($name='fly'){
return $this -> features ->filter(
function($entry) use ($name) {
return $entry->getName() == $name;
}
);
}
); }
{% for product in products %} {# start browse products #}
{% for feature in product.features if feature.name='ok' %}{# start browse features #}
{% endfor %}{# end browse features #}
{% endfor %}{# end browse products #}
希望这会对你有所帮助
问候