2012-05-23 72 views
0

我在爲我的代碼編寫正確的DQL時遇到問題(例外:PathExpression無效,必須是StateFieldPathExpression)。 我將從素描我的項目結構開始。Doctrine 2帶嵌套參數的DQL會拋出無效的PathExpression異常

每個實體從IdentifiableObject,提供每一個實體的ID

/** 
* @MappedSuperclass 
*/ 
class IdentifiableObject { 
    /** 
    * @Id 
    * @Column(type="integer") 
    * @GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

    /** 
    * getters and setters go here 
    */ 
} 

然後我們有一個具有「UserProperties」

/** 
* @Entity 
* @Table(name="users") 
*/ 
class User extends IdentifiableObject { 
    /** 
    * Other unimportant vars go here 
    */ 

    /** 
    * @Column(type="string") 
    */ 
    private $userName; 

    /** 
    * @OneToMany(targetEntity="UserProperty", mappedBy="user", cascade={"persist", "remove"}, orphanRemoval=true) 
    */ 
    private $userProperties = null; 

    public function __construct() { 
     $this->userProperties = new ArrayCollection(); 
    } 

    /** 
    * Getters and setters go here 
    */ 
} 

的Userproperty有一個屬性的列表(用戶對象繼承這基本上是說什麼樣的用戶屬性的類型)和值

/** 
    * @Entity 
    * @Table(name="userProperties") 
    */ 
    class UserProperty extends IdentifiableObject { 
     /** 
     * @OneToOne(targetEntity="Property") 
     * @JoinColumn(name="propertyID", referencedColumnName="id") 
     */ 
     private $property; 

     /** 
     * @ManyToOne(targetEntity="User") 
     * @JoinColumn(name="userID", referencedColumnName="id") 
     */ 
     private $userValue 
    } 

最後的物業

/** 
    * @Entity 
    * @Table(name="properties") 
    */ 
    class Property extends IdentifiableObject { 

     /** 
     * @Column(type="string") 
     */ 
     private $name; 

     /** 
     * @Column(type="string") 
     */ 
     private $description; 

     /** 
     * @Column(type="integer") 
     */ 
     private $mandatory = 0; 

     /** 
     * @OneToOne(targetEntity="PropertyType") 
     * @JoinColumn(name="type", referencedColumnName="id") 
     */ 
     private $type; 
} 

我想要做的就是有對應於某個屬性一個Userproperty所有用戶。 我的嘗試是:

$queryUserId = "SELECT userprop.user FROM UserProperty userprop JOIN userprop.property prop WHERE prop.id = '$propertyId'"; 

$queryUserId = "SELECT user FROM User user JOIN user.userProperties userprop WHERE userprop in(SELECT up FROM UserProperty up WHERE up.property = '$property')"; 

截至今天我不能得到的東西明智了其他那麼系統...「無效PathExpression必須是StateFieldPathExpression。」

任何人都可以幫忙嗎?

編輯:我會澄清我想在這裏做什麼。

我要的就是這個SQL查詢的DQL版本(工作):

SELECT * 
FROM users 
WHERE id 
IN (
    SELECT u.userId 
    FROM userproperties u, properties p 
    WHERE u.propertyID = p.id 
    AND p.id =1 
) 

凡p.id = XXX是屬性對象(或至少是ID),我想在我的搜索中使用。

回答

0

好吧,似乎我已經找到了工作DQL的解決方案:

$query = "SELECT user from User user WHERE user.id in(SELECT u FROM UserProperty up JOIN up.user u WHERE up.property = '$property')" 

作品! (您需要在subQuery中加入用戶,否則您會遇到可怕的「無效PathExpression」異常。

相關問題