0

コードの正しいDQLを記述できません(例外:無効なPathExpression。StateFieldPathExpressionである必要があります)。プロジェクトの構造をスケッチすることから始めます。

すべてのエンティティは、すべてのエンティティにIDを提供するIdentizableObjectから継承します

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

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

次に、「UserProperties」のリストを持つUserオブジェクトがあります。

 /**
 * @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;
}

私がやりたいのは、特定のプロパティに対応するユーザープロパティを持つすべてのユーザーを取得することです。私の試みは:

$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)になります。

4

1 に答える 1

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')"

動作します!(サブクエリでユーザーに参加する必要があります。そうしないと、恐ろしい「Invalid PathExpression」例外が発生します。

于 2012-05-31T08:59:38.437 に答える