0

我在为我的代码编写正确的 DQL 时遇到问题(异常:无效的 PathExpression。必须是 StateFieldPathExpression)。我将从勾勒我的项目结构开始。

每个实体都继承自 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 有一个属性(基本上是一个类型,说明它是什么类型的 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')"

作品!(您需要在子查询中加入用户,否则您会得到可怕的“无效路径表达式”异常。

于 2012-05-31T08:59:38.437 回答