2014-02-19 77 views
0

我試圖加載傳遞一個參數,以一個外鍵這是inverse sideSymfony2的學說傳遞參數外鍵在findBy功能

實體我有這樣的兩個實體

廣告

/** 
* Ad 
* 
* @ORM\Table(name="Ad") 
* @ORM\Entity(repositoryClass="Symarket\MarketBundle\Repository\AdRepository") 
*/ 
class Ad 
{ 
    /** 
    * @var AdImage 
    * 
    * @ORM\OneToMany(targetEntity="AdImage", mappedBy="ad", cascade={"persist", "merge"}) 
    */ 
    private $images; 

    //... 
} 

AdImage

/** 
* AdImage 
* 
* @ORM\Table(name="AdImage") 
* @ORM\Entity(repositoryClass="Symarket\MarketBundle\Repository\AdImageRepository") 
*/ 
class AdImage { 

    /** 
    * @var boolean 
    * 
    * @ORM\Column(name="adi_is_visible", type="boolean") 
    */ 
    protected $isVisible; 

    /** 
    * @var Ad 
    * 
    * @ORM\ManyToOne(targetEntity="Ad", inversedBy="images", cascade={"persist"}) 
    * @ORM\JoinColumn(name="adi_ad_id", referencedColumnName="ad_id") 
    */ 
    protected $ad; 
} 

現在,通過獲取Ad從數據庫中,我只想得到的圖像是"isVisibile" => true

這是怎麼可能與queryBuilder?

我試過至今所findBy功能是本

public function findById($adId) { 
    $res = $this->findBy(array("id" => $adId, "isVisible" => true, "images" => array("isVisible" => true))); 
    $ad = reset($res); 

    return $ad; 
} 

,我得到這個錯誤 您不能搜索的關聯字段「Symarket \ MarketBundle \實體\廣告#圖像」,因爲它是關聯的反面。查找方法僅適用於擁有邊關聯。

那我就這樣與QueryBuilder的

public function findById($adId) { 
    $res = $query = $this->createQueryBuilder('ad') 
      ->leftJoin('ad.images', 'img') 
      ->where('img.isVisible = :adVisible') 
      ->andWhere('ad.id = :id') 
      ->setParameter('adId', $adId) 
      ->setParameter('imgVisible', true) 
      ->getQuery(); 

    $ad = reset($res); 

    return $ad; 
} 

,我也得到NULL

在此先感謝。

+0

您可以發佈與QueryBuilder的你試圖查詢? – Peter

+0

編輯,問你是否需要更多的東西 – ponciste

+0

我不知道你爲什麼在查詢結果中使用'reset()'。如果你想得到一個單一的結果,你應該試試'getSingleResult()'或'getOneOrNullResult()'。如果你只想要產生多個查詢的第一個結果,你應該使用'getResult()'並且處理只使用控制器中第一個的邏輯。請參閱[Doctrine文檔](http://docs.doctrine-project.org/en/2.1/reference/dql-doctrine-query-language.html#query-result-formats) – Peter

回答

2

對於那些誰在這裏可以遇到這樣的問題去我的解決辦法:

public function findById($adId) { 
    $ad = $this->getEntityManager() 
      ->createQuery("SELECT a, i from MarketBundle:Ad a LEFT JOIN a.images i with i.isVisible = :visible where a.id = :adId") 
      ->setParameter("adId", $adId) 
      ->setParameter("visible", true)->getSingleResult(); 

    return $ad; 
} 
1

您可以使用AdImage實體的默認存儲庫執行此操作。考慮下面這個例子:

$entityManager = $this->getEntityManager(); 
// You said you already have the Ad entity instance you care about so just grabbing by id for demonstration purposes 
$ad = $entityManager->getRepository('Ad')->findOneById(5); 
$adImagesVisible = $entityManager->getRepository('AdImage')->findBy(array('isVisible' => true, 'ad' => $ad->getId())); 

如果你從關係的「多」方實體處理這個你應該能夠得到你想要的東西,而無需編寫自定義DQL查詢。