我正在尝试设置一个加权标签云,当标签是博客实体中的字符串属性时,它可以工作。
现在我已经设置了标签作为它自己的实体,并与博客作为双向的manymany/manymany关系。
不用说它不工作,我猜这是因为标签现在是它自己的对象。
我的问题:我在这里做错了什么,现在标签是它自己的实体,而不是从博客实体的字符串属性?
当我从下面的控制器转储$tagWeights,我得到一个错误,当我应该看到这样的东西:
array (size=78)
'Tag1' => float 1
'Tag2' => float 5
'Tag3' => float 2
错误:
foreach ($tags as $tag) {
$tagWeights[$tag] = (isset($tagWeights[$tag])) ? $tagWeights[$tag] + 1 : 1;
}
contextrorexception:警告:isset中的非法偏移类型或/var/web/html/satory/src/symfony/acmebundle/entity/tagrepository .php第34行
我在twig中以以下方式调用标签:
树枝> ontroller (dump $tags可以很好地显示所有标签)
public function footerAction()
{
$em = $this->getDoctrine()->getManager();
$tags = $em->getRepository('AcmeBundle:Tag')
->getTags();
$tagWeights = $em->getRepository('AcmeBundle:Tag')
->getTagWeights($tags);
var_dump($tagWeights); die();
return array(
'tags' => $tagWeights,
);
}
下面是getTags和getTagWeights:
public function getTags()
{
$tags = $this->createQueryBuilder('t')
->select('t.tag')
->getQuery()
->getResult();
return $tags;
}
public function getTagWeights($tags)
{
$tagWeights = array();
if (empty($tags))
return $tagWeights;
foreach ($tags as $tag)
{
$tagWeights[$tag] = (isset($tagWeights[$tag['tag']])) ? $tagWeights[$tag] + 1 : 1;
}
// Shuffle the tags
uksort($tagWeights, function() {
return rand() > rand();
});
$max = max($tagWeights);
// Max of 5 weights
$multiplier = ($max > 5) ? 5 / $max : 1;
foreach ($tagWeights as &$tag)
{
$tag = ceil($tag * $multiplier);
}
return $tagWeights;
}
标签实体class Tag
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="tag", type="string", length=255)
*/
private $tag;
/**
* @ORMManyToMany(targetEntity="Blog", mappedBy="tags")
*/
protected $blogs;
public function __construct()
{
$this->blogs = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set tag
*
* @param string $tag
* @return Tag
*/
public function setTag($tag)
{
$this->tag = $tag;
return $this;
}
/**
* Get tag
*
* @return string
*/
public function getTag()
{
return $this->tag;
}
/**
* Add blogs
*
* @param AcmeBundleEntityBlog $blogs
* @return Tag
*/
public function addBlog(AcmeBundleEntityBlog $blogs)
{
$this->blogs[] = $blogs;
return $this;
}
/**
* Remove blogs
*
* @param AcmeBundleEntityBlog $blogs
*/
public function removeBlog(AcmeBundleEntityBlog $blogs)
{
$this->blogs->removeElement($blogs);
}
/**
* Get blogs
*
* @return DoctrineCommonCollectionsCollection
*/
public function getBlogs()
{
return $this->blogs;
}
}
建议解决方案及结果
使用(isset($tagWeights[$tag['tag']]))
错误:
contextrorexcexception: Warning:非法偏移类型在/var/http:///html/satori/src/symfony/acmebundle/entity/tagrepository .php第34行
使用(isset($tagWeights[$tag[$tag->getTag()]))
错误:
contextrorexception:注意:试图获得非对象的属性在/var/ww/html/satori/src/symfony/acmebundle/entity/tagrepository .php行34
我想我知道这是怎么回事了…
当您在footerAction
中进行此呼叫时:
$tags = $em->getRepository('AcmeBundle:Tag')
->getTags();
您的存储库返回一个数组的数组。所以当你说:
isset($tagWeights[$tag])
…$tag
实际上是结果集的关联数组。我想你的意思是:
isset($tagWeights[$tag['tag']])
也就是说,我建议不要给你的Tag
实体一个名为tag
的属性。标签没有标签,它有名称或描述。这里写
isset($tagWeights[$tag['name']])
…或者让存储库返回Tag
实体本身(为什么甚至需要重写内置的getXyz()
方法?),并执行:
isset($tagWeights[$tag->getName()])