简体   繁体   中英

Doctrine2 association mapping with conditions

is it possible to have association mapping with conditions in Doctrine 2.4? I have entities Article and Comment. Comments needs to be approved by admin. Approval status of comment is stored in boolean field "approved.

Now I have @OneToMany association mapping to comments in entity Article. It maps all the comments. But I would like to map only approved comments.

Something like

@ORM\OneToMany(targetEntity="Comment", where="approved=true", mappedBy="article")

would be very helpful. Unfortunately AFAIK there is no such thing as where condition in mapping, so I tried to solve my problem with inheritance - I created two subclasses of class Comment. Now I have ApprovedComment and NotApprovedComment and SINGLE_TABLE inheritance mapping.

 @ORM\InheritanceType("SINGLE_TABLE")
 @ORM\DiscriminatorColumn(name="approved", type="integer")
 @ORM\DiscriminatorMap({1 = "ApprovedComment", 0 = "NotApprovedComment"})

Problem is, since "approved" column is discriminator, I cannot use it as field in entity Comment anymore.

You can use the Criteria API to filter the collection :

<?php

use Doctrine\Common\Collections\Criteria;

class Article
{

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="article")
     */
    protected $comments;

    public function getComments($showPending = false)
    {
        $criteria = Criteria::create();
        if ($showPending !== true) {
            $criteria->where(Criteria::expr()->eq('approved', true));
        }
        return $this->comments->matching($criteria);
    }

}

This is especially nice, because Doctrine is smart enough to only go to the database if the collection hasn't already been loaded.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM