symfony2中具有多个实体的独特slu ..

时间:2012-06-10 11:30:37

标签: symfony slug

我有一个小的symfony2应用程序,用户可以在其中创建页面。每个页面都可以通过route / {user_slug} / {page_slug}访问。我有实体用户和页面,我使用两个实体的可缓慢行为。为了找到正确的页面,user_slug和page_slug的组合必须是唯一的。

检查user_slug和page_slug的组合是否独特的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

在你的存储库中试试这个:

public function findByUsernameAndSlug($username, $slug)
{
    $em = $this->getEntityManager();
    $query = $em->createQuery("
        SELECT g
        FROM Acme\PagesBundle\Entity\Page p
        JOIN p.owner u
        WHERE u.username = :username
        AND p.slug = :slug
    ")
            ->setParameter('username', $username)
            ->setParameter('slug', $slug);

    foreach ($query->getResult() as $goal) {
        return $goal;
    }

    return null;
}

答案 1 :(得分:0)

在服务层中持久化实体之前,请检查给定的用户和页面slug组合是否唯一,如果不修改页面slug(追加-2或类似的东西)或抛出异常:

public function persistPage(Page $page) {
    $userSlug = $page->getUser()->getSlug();
    $pageSlug = $page->getSlug();

    if ($this->pagesRepository->findOneBySlugs($userSlug, $pageSlug) != null) {
        // given combination already exists
        throw new NonUniqueNameException(..);
        // or modify the slug
        $page->setSlug($page->getSlug() . '-2');
        return $this->persistPage($page);
    }

    return $this->em->persist($page);
}

// PagesRepository::findOneBySlugs($userSlug, $pageSlug)
public function findOneBySlugs($userSlug, $pageSlug) {
    $query = $this->em->createQueryBuilder('p')
            ->addSelect('u')
            ->join('p.user', 'u')
            ->where('p.slug = :pageSlug')
            ->where('u.slug = :userSlug;)
            ->getQuery();

    $query->setParameters(combine('userSlug', 'pageSlug'));

    return $query->getSingleResult();
}