> 백엔드 개발 > PHP 튜토리얼 > Symfony2 oneToMany 问题!

Symfony2 oneToMany 问题!

WBOY
풀어 주다: 2016-06-06 20:19:18
원래의
1275명이 탐색했습니다.

现在有两张表,category 和 article。

category:

<code class="php">/**
 * @Mapping\Entity
 * @Mapping\Table(name="category")
 */
class Category
{
    /**
     * @Mapping\Id
     * @Mapping\Column(type="integer")
     * @Mapping\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Mapping\OneToMany(targetEntity="Article", mappedBy="category")
     */
    protected $articles;

    // ...
}</code>
로그인 후 복사
로그인 후 복사

article:

<code>/**
 * @Mapping\Entity
 * @Mapping\Table(name="article")
 */
class Article
{
    /**
     * @Mapping\Id
     * @Mapping\Column(type="integer")
     * @Mapping\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Mapping\ManyToOne(targetEntity="Category", inversedBy="articles")
     * @Mapping\JoinColumn(name="categoryid", referencedColumnName="id")
     */
    protected $category;
    
    /**
     * @Mapping\Column(type="string", columnDefinition="enum('published', 'draft')")
     */
    protected $status;

    // ...
}</code>
로그인 후 복사
로그인 후 복사

我的问题是, $category->getArticles() 方法可以获取指定分类下的 articles,但是,如果我只想获取 status="published" 时怎么办呢?我看过文档,oneToMany 中不能设定条件

同时,在 twig 中使用 category.articles|length 来显示指定分类下的文章数,也只能返回全部的文章,这种场景怎么写呢?。

另外,我现在在 CategoryRepository 中使用 JOIN 加上条件查询出来,但在 twig 中显示出来的结果就还是忽略了 status 条件:

<code class="php">return $this->createQueryBuilder('c')
     ->leftJoin('c.articles', 'a', 'WITH', 'a.status = :status')
     ->groupBy('c.id')
     ->setParameter('status', 'published')
     ->getQuery()
     ->getResult();</code>
로그인 후 복사
로그인 후 복사

回复内容:

现在有两张表,category 和 article。

category:

<code class="php">/**
 * @Mapping\Entity
 * @Mapping\Table(name="category")
 */
class Category
{
    /**
     * @Mapping\Id
     * @Mapping\Column(type="integer")
     * @Mapping\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Mapping\OneToMany(targetEntity="Article", mappedBy="category")
     */
    protected $articles;

    // ...
}</code>
로그인 후 복사
로그인 후 복사

article:

<code>/**
 * @Mapping\Entity
 * @Mapping\Table(name="article")
 */
class Article
{
    /**
     * @Mapping\Id
     * @Mapping\Column(type="integer")
     * @Mapping\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Mapping\ManyToOne(targetEntity="Category", inversedBy="articles")
     * @Mapping\JoinColumn(name="categoryid", referencedColumnName="id")
     */
    protected $category;
    
    /**
     * @Mapping\Column(type="string", columnDefinition="enum('published', 'draft')")
     */
    protected $status;

    // ...
}</code>
로그인 후 복사
로그인 후 복사

我的问题是, $category->getArticles() 方法可以获取指定分类下的 articles,但是,如果我只想获取 status="published" 时怎么办呢?我看过文档,oneToMany 中不能设定条件

同时,在 twig 中使用 category.articles|length 来显示指定分类下的文章数,也只能返回全部的文章,这种场景怎么写呢?。

另外,我现在在 CategoryRepository 中使用 JOIN 加上条件查询出来,但在 twig 中显示出来的结果就还是忽略了 status 条件:

<code class="php">return $this->createQueryBuilder('c')
     ->leftJoin('c.articles', 'a', 'WITH', 'a.status = :status')
     ->groupBy('c.id')
     ->setParameter('status', 'published')
     ->getQuery()
     ->getResult();</code>
로그인 후 복사
로그인 후 복사

class Category
{
...
public function getPublishedArticles()
{

<code>$result = new ArrayCollection();

foreach ($this->articles as $article) {
    if ($article->getStatus() == 'published') {
        $result[] = $article;
    }
}

return $result;</code>
로그인 후 복사

}

从articles的角度解决问题。

在controller里面

<code>$articles = $this
    ->getDoctrine()
    ->getRepository('Article')
    ->findBy([
        'category' => $category,
        'status'   => 'published',    
    ]);</code>
로그인 후 복사

然后view里面就可以用articles|length了。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿