I have the following two entities, Courses and Categories. A course can be 
in multiple categories, and obviously a category can have multiple courses. 
So I have mapped this as a many-to-many.

(I have removed much of the irrelevant code)

*Category Model:*
**
 * models\Category
 *
 * @ORM\Table(name="item_category")
 * @ORM\Entity(repositoryClass="models\repositories\CategoryRepository")
 */

class Category{

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     * @Assert\NotBlank()
     */
    protected $name;

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="models\Course")
     * @ORM\JoinTable(name="item_category_assignment",
     *    inverseJoinColumns={@ORM\JoinColumn(name="item_id", 
referencedColumnName="id")},
     *    joinColumns={@ORM\JoinColumn(name="item_category_id", 
referencedColumnName="id")}
     * )
     */
    protected $courses;

    public function __construct()
    {
        $this->courses  = new ArrayCollection();
    }
}

*Course Model:*

/**
 * models\Course
 *
 * @ORM\Table(name="item")
 * @ORM\Entity(repositoryClass="models\repositories\CourseRepository")
 */

class Course{

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     * @Assert\NotBlank()
     */
    protected $name;

    /**
     * @var ArrayCollection
     * @ORM\ManyToMany(targetEntity="models\Category", cascade={"persist"})
     * @ORM\JoinTable(name="item_category_assignment",
     *    joinColumns={@ORM\JoinColumn(name="item_id", 
referencedColumnName="id")},
     *    inverseJoinColumns={@ORM\JoinColumn(name="item_category_id", 
referencedColumnName="id")}
     * )
     */
    protected $categories;

    public function __construct()
    {
        $this->categories        = new ArrayCollection();
    }
}


In my *CategoryRepository, *I am trying to select just one category which 
has more than 1 course in it, and all of it's courses, in the same query.

    /**
     * Get a category that has multiple (>1) courses in it.
     *
     * @return \models\Category|null
     */
    public function getOneWithCourses()
    {
        $qb = $this->_em->createQueryBuilder();
        $q  = $qb->select('category') 
                 ->from('models\Category', 'category')
                 ->innerJoin('category.courses', 'courses')
                 ->having('COUNT(courses.id) > 1');
        return $q->getQuery()->*setMaxResults(1)*->getOneOrNullResult();
    }

If I do: $q  = $qb->select('category', *'courses'*), then I get one 
category and only ONE of the courses. It only gets all of the courses if I 
do not select the courses, and just rely on lazy-loading.

Is there a way to do this in one query, or is this really the right way to 
do it?

-- 
You received this message because you are subscribed to the Google Groups 
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to