Search code examples
mysqlsqlsymfonydoctrine-ormdql

Many-To-Many + WHERE field <> value


I have "Post" entity with relation manyToMany

 /**
 * @ORM\ManyToMany(targetEntity="Core\CoreBundle\Entity\User", cascade={"persist", "remove", "merge"})
 * @ORM\JoinTable(name="blogregion_post_views")
 */
protected $views;

 /**
 * @ORM\ManyToMany(targetEntity="Application\BlogRegionBundle\Entity\PostTag", cascade={"persist", "remove", "merge"})
 * @ORM\JoinTable(name="blogregion_tags_match")
 */
protected $tags;

And i want to get a new Posts

    $query = $this->getEm()->createQuery("
        SELECT p FROM BlogRegionBundle:Post p LEFT JOIN p.tags t LEFT JOIN p.views v
        WHERE t.id = :blogId AND p.state = :state AND p.deleted = 0 AND (v <> :user OR v IS NULL )

    ")
        ->setParameter('blogId', $blogId)
        ->setParameter('state', 1)
        ->setParameter('user', $this->getUser())
    ;

but it return "Post" if my user exist in "views" relation

How i can resolve this problem?


Solution

  • You could try using a MEMBER OF condition.

    SELECT p FROM BlogRegionBundle:Post p LEFT JOIN p.tags t WHERE t.id = :blogId AND p.state = :state AND p.deleted = 0 AND :user NOT MEMBER OF p.views
    

    From http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples