在symfony2 twig模板中找不到实体

时间:2013-12-18 10:33:15

标签: mysql symfony doctrine-orm twig

在我的项目中,我有一个名为service_provider的表。每个服务提供商都有一个评级系统。

我的服务提供商实体,

class ServiceProviders
{
    /**
     * @var integer
     *
     * @ORM\Column(name="service_provider_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $serviceProviderId;


     /**
     * @var \Ratings
     *
     * @ORM\OneToOne(targetEntity="Ratings",inversedBy="serviceProviders",cascade={"all"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="service_provider_id", referencedColumnName="service_provider_id")
     * })
     */
    private $ratings;
}

我的评级实体,

class Ratings
{

    /**
     * @var integer
     *
     * @ORM\Column(name="service_provider_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $serviceProviderId;

    /**
     * @var \ServiceProviders
     *
     * @ORM\OneToOne(targetEntity="ServiceProviders",mappedBy="ratings",cascade={"all"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="service_provider_id", referencedColumnName="service_provider_id")
     * })
     */
    private $serviceProviders;
}

在我的serviceProviderEntity中,我写了一个连接查询来获取所有数据。

class ServiceProvidersRepository extends EntityRepository
{
    public function findAllProviders($where,$order,$rowCount,$page)
    {
        $query = $this->createQueryBuilder('s')
                ->select('s')
            ->leftJoin('s.ratings','r')
                    ->where('s.status= :status')
            ->andWhere($where)
                ->setParameter('status', 'A')
            ->orderBy($order)
                    ->setMaxResults($rowCount)
                    ->setFirstResult($offset)
                    ->getQuery();
        $result = $query->getResult();
     }
}

一切正常,但是当评级表中没有与服务提供商对应的数据时,树枝模板中发生错误'未找到实体'。任何人都可以帮助我,如何解决这个问题。

我的控制器动作,

 public function providerSearchAction()
 {
       $pagination = $entityManager->getRepository('EvpEventpriceBundle:ServiceProviders')->findAllProviders($where,'s.serviceProviderId',$rowCount,$page);
       return $this->render('EvpEventpriceBundle:ServiceProviders:search.html.twig',array('pagination'=>$pagination));
  }

我的树枝模板,

{% for provider in pagination %}
     {% for i in 0..4 %}

    {% if provider.ratings|length %}
    {% if (i<((provider.ratings.totalValue/provider.ratings.totalVotes)|number_format)-0.5) %}
        {% set class = "ratings_stars ratings_vote" %}
    {% else %}
        {% set class = "ratings_stars" %}
    {% endif %}
    {% endif %}
    <div class="star_{{i+1}} {{class}}"></div>
    {% endfor %}

{%endfor%}

2 个答案:

答案 0 :(得分:1)

你可以用这个改变你的第四行树枝并尝试:

{% if provider.ratings is defined and provider.ratings is not empty %}

并在测试未实例化类变量

的情况下添加{% set class = "" %}

答案 1 :(得分:0)

这里有一些问题:

您将同一数据库列映射为实体中的字段/列关联。这将使Doctrine非常困惑! 始终在字段/列关联之间进行选择(通常您需要关联)。

此外,您使用的是@ORM\JoinColumns@ORM\JoinColumn就足够了。

不要在关联的两边使用级联选项,这将极大地影响Doctrine的性能。此外,感觉就像你把cascade={"all"}放在那里,因为当你阅读文档时听起来很方便(没有双关语意)。但是在使用级联时你应该仔细考虑。每个级联都有性能损失,所以我的建议是等到你真正需要它们之后再使用它们。

nullable=FALSE上不需要

@Column,默认情况下不允许在字段/列上使用nullable。 然而,他们 默认情况下允许关联。

您正在使用复数形式的名称,其中单数形式更好。例如,您的实体ServiceProviders可以更好地命名为ServiceProvider,因为1个实体是1个ServiceProvider(不是很多ServiceProviders)。

我不确定你希望成为拥有方面的关联的哪一方。我假设您希望Rating成为拥有者,因为您使用service_provider_id作为外键。

这是我上面提到的事情的解决方法:

/**
 * @ORM\Entity
 */
class ServiceProvider
{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="Rating", mappedBy="serviceProvider")
     */
    private $rating;

}

/**
 * @ORM\Entity
 */
class Rating
{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="Customer", inversedBy="rating")
     * @ORM\JoinColumn(name="service_provider_id", referencedColumnName="id")
     */
    private $serviceProvider;

}

您可以(并且应该)始终使用控制台验证您的映射:Doctrine 2:doctrine orm:validate-schema,Symfony 2:app/console doctrine:schema:validate