Symfony2-未在数组中设置和加权标记权重
我有一个方法设置来称量使用最多的标签。我使用这里的示例作为学习练习:(参见Tag Cloud)我的做法略有不同,因为我使用标记作为实体,而不是基于链接的博客实体的字符串属性 标记设置为manytomy/manytomy-to-Blog实体,见下文 我遇到的问题是,标签正在按预期进行检索,但显然没有设置,因此所有标签都返回为1的整数。我怎样才能纠正这个问题?我是否将标签错误地调用到没有考虑哪些标签被多次使用的位置?Symfony2-未在数组中设置和加权标记权重,symfony,tags,tag-cloud,Symfony,Tags,Tag Cloud,我有一个方法设置来称量使用最多的标签。我使用这里的示例作为学习练习:(参见Tag Cloud)我的做法略有不同,因为我使用标记作为实体,而不是基于链接的博客实体的字符串属性 标记设置为manytomy/manytomy-to-Blog实体,见下文 我遇到的问题是,标签正在按预期进行检索,但显然没有设置,因此所有标签都返回为1的整数。我怎样才能纠正这个问题?我是否将标签错误地调用到没有考虑哪些标签被多次使用的位置? $tagWeights[$tag['tag']]=(isset($tagWeigh
$tagWeights[$tag['tag']]=(isset($tagWeights[$tag['tag']])$标记权重[$tag['tag']]+1:1代码>
getTagWeights(var dumping$tagWeights[$tag['tag']]返回一个1的整数)
标记实体
class Tag
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="tag", type="string", length=255)
*/
private $tag;
/**
* @ORM\ManyToMany(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 \AcmeBundle\Entity\Blog $blogs
* @return Tag
*/
public function addBlog(\AcmeBundle\Entity\Blog $blogs)
{
$this->blogs[] = $blogs;
return $this;
}
/**
* Remove blogs
*
* @param \AcmeBundle\Entity\Blog $blogs
*/
public function removeBlog(\AcmeBundle\Entity\Blog $blogs)
{
$this->blogs->removeElement($blogs);
}
/**
* Get blogs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getBlogs()
{
return $this->blogs;
}
}
/**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="blogs")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
*/
protected $tags;
public function __construct()
{
$this->tags = new ArrayCollection();
}
/**
* Add tags
*
* @param \AcmeBundle\Entity\Tag $tags
* @return Blog
*/
public function addTag(\AcmeBundle\Entity\Tag $tags)
{
$this->tags[] = $tags;
return $this;
}
/**
* Remove tags
*
* @param \AcmeBundle\Entity\Tag $tags
*/
public function removeTag(\AcmeBundle\Entity\Tag $tags)
{
$this->tags->removeElement($tags);
}
/**
* Get tags
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTags()
{
return $this->tags;
}
博客实体
class Tag
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="tag", type="string", length=255)
*/
private $tag;
/**
* @ORM\ManyToMany(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 \AcmeBundle\Entity\Blog $blogs
* @return Tag
*/
public function addBlog(\AcmeBundle\Entity\Blog $blogs)
{
$this->blogs[] = $blogs;
return $this;
}
/**
* Remove blogs
*
* @param \AcmeBundle\Entity\Blog $blogs
*/
public function removeBlog(\AcmeBundle\Entity\Blog $blogs)
{
$this->blogs->removeElement($blogs);
}
/**
* Get blogs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getBlogs()
{
return $this->blogs;
}
}
/**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="blogs")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
*/
protected $tags;
public function __construct()
{
$this->tags = new ArrayCollection();
}
/**
* Add tags
*
* @param \AcmeBundle\Entity\Tag $tags
* @return Blog
*/
public function addTag(\AcmeBundle\Entity\Tag $tags)
{
$this->tags[] = $tags;
return $this;
}
/**
* Remove tags
*
* @param \AcmeBundle\Entity\Tag $tags
*/
public function removeTag(\AcmeBundle\Entity\Tag $tags)
{
$this->tags->removeElement($tags);
}
/**
* Get tags
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTags()
{
return $this->tags;
}
函数返回1的问题总是因为您执行了以下操作
foreach ($tags as $tag)
{
$tagWeights[$tag['tag']] = (isset($tagWeights[$tag['tag']])) ? $tagWeights[$tag['tag']] + 1 : 1;
var_dump($tagWeights[$tag['tag']]);
}
您对每个标记迭代一次,因此$tagWeights[$tag['tag']]对每个标记的加入次数不超过一次,因此始终具有值1
实现这一点的一种方法是使用blog,而不是如下所示的标记,这样您就不必更改太多代码:
foreach ($blogs as $blog)
{
foreach($blog->getTags() as $tag){
$tagWeights[$tag->getTag()] = (isset($tagWeights[$tag->getTag()])) ? $tagWeights[$tag->getTag()] + 1 : 1;
var_dump($tagWeights[$tag->getTag()]);
}
}
您需要将$blogs变量传递给函数,而不是$tags
public function getTagWeights($blogs)
{
...
}
上面的代码没有经过测试,但可能是类似的
我认为另一个问题是,在标记实体中,您没有为标记使用唯一的注释,这样,可能有一些标记具有完全相同的名称,这不是标记云的预期行为。你应该这样做:
/**
* @var string
*
* @ORM\Column(name="tag", type="string", length=255, unique=true)
*/
private $tag;
好的,我已经添加了unique=true,但它仍然没有添加权重。如何解决第一个问题?@dizzyd我已经编辑了我的答案,解释了一个可能的解决方案。好的,我已经试过了,但没有找到标签。我是否需要更改getTags()方法以从blog实体获取?我需要使用getBlogs()函数来实现这一点,然后使用上面的代码。当我使用foreach($blog->getTags()as$tag)
时,我得到以下错误:FatalErrorException:错误:调用成员函数getTags()在/var/www/html/Symfony/src/AcmeBundle/Entity/TagRepository.php第53行的非对象上