0

因为我才几天才学习 symfony2 和教义 2,所以我有很多疑问,对于更有经验的人来说可能是愚蠢的。

我有一个带有“标签”字段的博客文章类:

class Article 
{
    /**
     * @ORM\Column(type="array")
     */
     protected $tags;
}

现在,我看到 Doctrine 以这种格式将它们作为“longtext”类型存储在数据库中:

a:4:{i:0;s:8:"symfony2";i:1;s:3:"php";i:2;s:8:"paradise";i:3;s:7:"symblog";}

由于我创建了一个标签页面,其中显示了由所选标签标记的所有文章,因此我需要检查博客文章的“标签数组”中是否有此标签。

public function getByTag($tag)
{
    $likelyBlogs = $this->createQueryBuilder('b')
        ->select('b')
        ->where('LOWER(b.tags) LIKE :tag')
        ->setParameter('tag', '%:"'.$tag.'"%')
        ->getQuery()
        ->getResult();

    return $likelyBlogs;
}

然而,这完美地工作,->where('LOWER(b.tags) LIKE :tag')对我来说看起来有点 hacky 所以我想检查是否有任何其他更“自然”的方法来检查值是否存在于数组中?

4

1 回答 1

0

看看多对多关系:http ://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-unidirectional

如果您真的想将标签存储在与博客文章相同的行中,您应该考虑使用像 MongoDB 这样的 NoSQL 数据库。但在普通 SQL 中,最好对表进行规范化并将标签放在一个表中。

于 2012-12-05T13:58:05.417 回答