在我的项目中,我有一个名为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%}
答案 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
。