dongzou7134 2014-03-22 08:24
浏览 50
已采纳

选择引用对象属性等于value的实体

Right now i try to wrap my head around Doctrine2.

So i have the following structure:

I have an article entity:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="article")
 */
class Article extends BaseEntity {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="ArticleRevision", mappedBy="article", cascade={"persist"})
     * @var ArrayCollection
     */
    private $articleRevisions;

    /**
     * @ORM\ManyToOne(targetEntity="ArticleRevision")
     * @ORM\JoinColumn(name="currentRevisionId", referencedColumnName="id", nullable=true)
     * @var ArticleRevision
     */
    private $currentRevision;

    public function __construct(array $options = null) {
        $this->articleRevisions = new ArrayCollection();
        parent::__construct($options);
    }

    /**
     * @return int
     */
    public function getId() {
        return $this->id;
    }
    /**
     * @param int $id
     */
    public function setId($id) {
        $this->id = $id;
    }

    /**
     * @param ArticleRevision $articleRevision
     */
    public function addArticleRevision($articleRevision) {
        $this->articleRevisions[] = $articleRevision;
        $articleRevision->setArticle($this);
    }

    /**
     * @return ArrayCollection
     */
    public function getArticleRevisions() {
        return $this->articleRevisions;
    }

    /**
     * @return ArticleRevision
     */
    public function getCurrentRevision() {
        return $this->currentRevision;
    }
    /**
     * @param ArticleRevision $articleRevision
     */
    public function setCurrentRevision($articleRevision) {
        $this->currentRevision = $articleRevision;
    }
}

that has articleRevisions and references its current revision:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="articlerevision")
 */
class ArticleRevision extends BaseEntity {

    const TYPE_RELEASE = "release";
    const TYPE_DRAFT = "draft";
    const TYPE_AUTOSAVE = "autosave";

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     * @var int
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Category")
     * @ORM\JoinColumn(name="categoryId", referencedColumnName="id")
     * @var Category
     **/
    private $category;

    /**
     * @ORM\ManyToOne(targetEntity="Article", inversedBy="articleRevisions")
     * @ORM\JoinColumn(name="articleId", referencedColumnName="id")
     * @var Article
     **/
    private $article;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $urlParam;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $copyright;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $supertitle;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $title;

    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $teaser;

    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $text;

    /**
     * @ORM\ManyToOne(targetEntity="ArticleRevision")
     * @ORM\JoinColumn(name="previousRevisionId", referencedColumnName="id", nullable=true)
     * @var ArticleRevision
     */
    private $previousRevision;

    public function __construct(array $options = null) {
        parent::__construct($options);
    }

    /**
     * @return int
     */
    public function getId() {
        return $this->id;
    }
    /**
     * @param int $id
     */
    public function setId($id) {
        $this->id = $id;
    }

    /**
     * @return Category
     */
    public function getCategory() {
        return $this->category;
    }
    /**
     * @param Category $category
     */
    public function setCategory($category){
        $this->category = $category;
    }

    /**
     * @return Article
     */
    public function getArticle() {
        return $this->article;
    }
    /**
     * @param Article $article
     */
    public function setArticle($article) {
        $this->article = $article;
    }

    /**
     * @return string
     */
    public function getCopyright() {
        return $this->copyright;
    }
    /**
     * @param string $copyright
     */
    public function setCopyright($copyright) {
        $this->copyright = $copyright;
    }

    /**
     * @return string
     */
    public function getUrlParam() {
        return $this->urlParam;
    }
    /**
     * @param string $urlParam
     */
    public function setUrlParam($urlParam) {
        $this->urlParam = $urlParam;
    }

    /**
     * @return string
     */
    public function getSupertitle() {
        return $this->supertitle;
    }
    /**
     * @param string $supertitle
     */
    public function setSupertitle($supertitle) {
        $this->supertitle = $supertitle;
    }

    /**
     * @return string
     */
    public function getTitle() {
        return $this->title;
    }

    /**
     * @param string $title
     */
    public function setTitle($title) {
        $this->title = $title;
    }

    /**
     * @return string
     */
    public function getTeaser() {
        return $this->teaser;
    }
    /**
     * @param string $teaser
     */
    public function setTeaser($teaser) {
        $this->teaser = $teaser;
    }

    /**
     * @return string
     */
    public function getText() {
        return $this->text;
    }
    /**
     * @param string $text
     */
    public function setText($text) {
        $this->text = $text;
    }

    /**
     * @return ArticleRevision
     */
    public function getPreviousRevision() {
        return $this->previousRevision;
    }
    /**
     * @param ArticleRevision $previousRevision
     */
    public function setPreviousRevision($previousRevision) {
        $this->previousRevision = $previousRevision;
    }
} 

What i am trying to achieve is to select every article, where the categoryId of the currentRevision is for example 1.

I've tried:

$qb = $this->getRepository()->createQueryBuilder('a');
$qb->leftJoin('a.currentRevision', 'r')
   ->where('r.category = :category')
   ->setParameters(array('category' => $category));
return $qb->getQuery()->getResult();

Where $category is an int or the Application\Entity\Category. Both is returning an empty array. Can you point me in the right direction?

Any help is appreciated!

EDIT

Ouput of $qb->__toString():

SELECT a FROM Application\Entity\Article a LEFT JOIN a.currentRevision r WHERE r.category = :category

  • 写回答

1条回答 默认 最新

  • douzhi8488 2014-03-22 11:01
    关注

    r.category = :category, reference to Entity Category not to scalar field, you should join also Category and change condition to something like that:

    $qb = $this->getRepository()->createQueryBuilder('a');
    $qb->leftJoin('a.currentRevision', 'r')
       ->leftJoin('r.category', 'c')
       ->where('c.id = :category')
       ->setParameters(array('category' => $category));
    return $qb->getQuery()->getResult();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行