【问题标题】:Entity was not found in symfony2 twig template在 symfony2 树枝模板中找不到实体
【发布时间】:2013-12-18 10:33:14
【问题描述】:

在我的项目中,我有一个名为 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();
     }
}

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

我的控制器动作,

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

【问题讨论】:

  • 你可以添加你的树枝模板吗?
  • 请您的控制器操作也一样

标签: mysql symfony doctrine-orm twig


【解决方案1】:

你能不能用这个改变你的第 4 行树枝并尝试:

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

并添加{% set class = "" %},以防测试不实例化类变量

【讨论】:

  • 对不起,我的存储库中已经有一个 return 语句,我忘记将它包含在代码 sn-p 中。
  • 你能把错误信息放在描述中看看异常是在哪一行启动的吗?
【解决方案2】:

这里有几个问题:

您将同一数据库列映射为实体中的字段/列和关联。这会让Doctrine很困惑! 总是在字段/列之间选择或关联(通常你会想要关联)。

另外,你在不应该使用@ORM\JoinColumns 的地方使用@ORM\JoinColumn 就足够了。

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

@Column 不需要nullable=FALSE,默认情况下,字段/列不允许为空。 它们是但默认情况下在关联中是允许的。

您使用的是名称的复数形式,而单数形式更好。例如,您的实体ServiceProviders 最好命名为ServiceProvider,因为1 个实体就是1 个ServiceProvider(ServiceProvider 不多)。

我不太确定你想成为拥有协会的哪一方。我假设您希望 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。

【讨论】:

  • 感谢您的回复和建议。我进行了上述更改,但仍然遇到同样的错误。我是 symfony 和教义的新手,我只有有限的时间来研究它。所以我对大多数事情感到非常困惑。您能告诉我如何在 symfony2 中实现左连接以及如何在 twig 上显示其结果。否则请给我一个参考链接。
  • 您可以使用控制台验证映射吗?那输出什么?
猜你喜欢
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2013-04-30
  • 1970-01-01
  • 2013-08-07
  • 2016-06-09
相关资源
最近更新 更多