第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

選擇僅包含 N 個標(biāo)簽的文章

選擇僅包含 N 個標(biāo)簽的文章

PHP
瀟瀟雨雨 2022-12-11 10:12:43
我有兩個實體,文章實體和標(biāo)簽實體。這兩個實體之間存在 ManyToMany 關(guān)系(一篇文章可以有 0->N 個標(biāo)簽,一個標(biāo)簽可以包含在 0->N 篇文章中)我想要在某些條件下搜索文章(我必須使用查詢生成器,像 findBy() 這樣的魔術(shù)方法還不夠),這些條件之一是選擇恰好包含 N 個特定標(biāo)簽的文章我嘗試了幾次以獲得預(yù)期的結(jié)果但沒有成功。我想我誤解了學(xué)說如何與連接表一起工作。我最后一次嘗試:public function search($titles, $tags, $authors){    $query = $this->createQueryBuilder('a') // a = article        ->orderBy('a.createdAt', 'DESC')        ->setMaxResults($limit)        ->setFirstResult($offset);    if($titles !== null){        // ...    }    // tags is an array of string containing names of searched tags (ex : $tags = ['english', 'french', 'game', 'guide'] )    if($tags !== null){        // $query->innerJoin('a.tags', 't');        // $tagsQuery = "";        // foreach ($tags as $id => $tag){        //     if($id > 0) $tagsQuery .= " AND ";        //     $tagsQuery .= "t.name LIKE :tag_".$id;        //     $query->setParameter("tag_".$id, '%'.$tag.'%');        // }        // $query        //     ->andWhere($tagsQuery);        $query->leftjoin ('a.tags','t');        foreach ($tags as $id => $tag){        // $query->andWhere("t.name LIKE :tag_".$id);        // $query->setParameter("tag_".$id, '%'.$tag.'%');            $query                ->addSelect('t')                ->andwhere("t.name LIKE :tag_".$id)                ->setParameter("tag_".$id, '%'.$tag.'%');        }    }    // ...預(yù)期結(jié)果的示例:有 3 篇文章:- id 1 - tags :     - guide    - game- id 2 - tags :     - english- id 3 - tags :     - english    - guide該方法search(null, ['guide','english'], null)必須只返回 id 為 3 的文章
查看完整描述

2 回答

?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗 獲得超8個贊

如果你想讓所有文章都至少有一個指定的標(biāo)簽,你的代碼應(yīng)該是這樣的:


    public function search($titles, $tags, $authors)

    {


        return $query = $this->createQueryBuilder('a') // a = article

            ->innerJoin('a.tags', 't') //on inner join is enough

            ->where('t.name in (:set)')

            ->setParameter('set', $tags)

            ->orderBy('a.createdAt', 'DESC')

            ->setMaxResults($limit)

            ->setFirstResult($offset)

            ->getQuery()   //retrieve

            ->getResult();

    }

第一個 SQL 將進行連接。提示是使用“in”運算符。


如果您想要包含所有標(biāo)簽(完全是所有)的文章,您應(yīng)該為每個標(biāo)簽添加一個內(nèi)部連接。技巧是為每個連接添加一個別名,并在別名上添加一個唯一的東西。



    public function search($titles, $tags, $authors)

    {


        $query = $this->createQueryBuilder('a') // a = article;


        foreach ($tags as $index => $tag) {

             $query->innerJoin('a.tags', "t$index")

               ->andWhere("t$index" + ".name in (:tag$index)")

               ->setParameter("tag$index", $tag)

        }


        return $query

            ->orderBy('a.createdAt', 'DESC')

            ->setMaxResults($limit)

            ->setFirstResult($offset)

            ->getQuery()   //retrieve

            ->getResult();

你的要求應(yīng)該是這樣的。我沒有測試它們,但這是模板。


查看完整回答
反對 回復(fù) 2022-12-11
?
慕雪6442864

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊

如果有人有同樣的問題,這里的代碼:


     foreach ($tags as $id => $tag) {

            $query->innerJoin('a.tags', "t${id}")

                ->andWhere("t${id}.name in (:tag${id})")

                ->setParameter(":tag${id}", $tag);

     }


查看完整回答
反對 回復(fù) 2022-12-11
  • 2 回答
  • 0 關(guān)注
  • 141 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號