主义一对多的关系

时间:2015-05-24 04:48:24

标签: php symfony doctrine-orm doctrine one-to-many

我对一对多关系的学说感到困惑。

问题1:

如果我错了,请纠正我。我假设当我尝试

$em = $this->getDoctrine()->getManager();
$product_repo = $em->getRepository('MyBundle:Product');
$products = $product_repo->findAll();
dump($products);

我将看到附加到$ features变量的相关功能,所以当我使用$ products-> getFeatures()时,我将以数组形式使用Feature对象。但是从转储调试我没有看到任何附加到它而不是我得到了这个:

enter image description here

另一方面我也这样做

$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

1 个答案:

答案 0 :(得分:3)

假设您的转储功能是symfony / var-dumper而不是自定义功能

问题1

是的,默认情况下,dump函数不会显示嵌套集合,而是关于性能。这不是与学说相关的问题。您的数据已加载到此处。

您可以使用var-dumper的高级用途,例如脚轮(http://symfony.com/doc/current/components/var_dumper/advanced

问题2

您有不同的方法来解决您的问题:

在控制器中:在产品

中创建自定义方法

标准更好的解决方案

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 #}

希望这会对你有所帮助

问候