2012-08-16 55 views
1

當我執行此查詢FosUserBundle和學說要求

public function SearchByfournisseur($keyWord) 
{ 
      $qb = $this->createQueryBuilder('p')->distinct()->select('p'); 
      $qb ->leftJoin('p.Fournisseur', 'f'); 
        $qb ->where($qb->expr()->eq('f.username', $keyWord)); 
        $query = $qb->getQuery();  
      $products = $query->getResult(); 
      return $products; 

} 

我得到這個錯誤:

[Semantical Error] line 0, col 110 near 'test': Error: 'test' is not defined.

但是這一次完美的作品:

public function SearchByfournisseur($keyWord) 
{ 
      $qb = $this->createQueryBuilder('p')->distinct()->select('p'); 
      $qb ->leftJoin('p.Fournisseur', 'f'); 
        $qb ->where($qb->expr()->eq('f.id', $keyWord)); 
        $query = $qb->getQuery();  
      $products = $query->getResult(); 
      return $products; 
} 

這意味着,我可以」除了他的id以外,不能訪問用戶的屬性。

有沒有解決這個問題?

編輯: 這是有關實體:

<?php 
namespace Ecommerce\boutiqueBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use FS\SolrBundle\Doctrine\Annotation as Solr; 

/** 
* Ecommerce\boutiqueBundle\Entity\Produit 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="Ecommerce\boutiqueBundle\Entity\ProduitRepository") 
*/ 


class Produit 
{ 

    /** 
    * @var integer $id 
    *@Solr\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Ecommerce\UserBundle\Entity\User",inversedBy="Produits") 
    * 
    * @ORM\JoinColumn(name="Fournisseur_id", referencedColumnName="id") 
    */ 
    private $Fournisseur; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 



    /** 
    * Set Fournisseur 
    * 
    * @param string $Fournisseur 
    */ 
    public function setFournisseur($Fournisseur) 
    { 
     $this->Fournisseur = $Fournisseur; 
    } 

    /** 
    * Get Fournisseur 
    * 
    * @return string 
    */ 
    public function getFournisseur() 
    { 
     return $this->Fournisseur; 
    } 
    } 

Fournisseur實體:

<?php 
namespace Ecommerce\UserBundle\Entity; 
use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 
/** 
* @ORM\Entity 
* @ORM\Table(name="Ecommerce_user") 
*/ 
class User extends BaseUser 
{ 
    public function __construct() 
     { 
     parent::__construct(); 
     $this->Produits = new \Doctrine\Common\Collections\ArrayCollection(); 

     } 

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

    /** 
    * @ORM\OneToMany(targetEntity="Ecommerce\boutiqueBundle\Entity\Produit", 
    * mappedBy="Fournisseur") 
    */ 
    protected $Produits; 


    public function addProduit(\Ecommerce\boutiqueBundle\Entity\Produit $Produit) 
    { 
    $this->Produits[] = $Produit; 
    $Produit->setCategorie($this); 
    } 

    public function getProduits() 
    { 
     return $this->Produits; 
    } 

} 

回答

1

您必須指定leftJoin()調用中的連接條件。

public function SearchByfournisseur($keyWord) 
{ 
    $qb = $this->createQueryBuilder('p')->distinct()->select('p'); 
    $qb ->leftJoin('p.Fournisseur', 'f', 'WITH', $qb->expr()->eq('f.username = ?', $keyWord)); 
    $products = $query->getResult(); 
    return $products; 
} 

我建議您閱讀關於QueryBuilder的Doctrine文檔章節。

+0

感謝您的快速回答! 但寫入內部或外部連接似乎不是問題,因爲我在其他請求中使用此語法沒有任何問題。 問題是爲什麼這個語法「product.fournisseur.id」是正確的,而這個「product.fournisseur.username」不是。 – 2012-08-16 14:56:41

+0

每個語法都應該是正確的。如果你需要更多的幫助,你應該粘貼你的實體。 – Florent 2012-08-16 14:59:16