我在为我的代码编写正确的 DQL 时遇到问题(异常:无效的路径表达式。必须是 StateFieldPathExpression)。我将从勾勒出我的项目结构开始。
每个实体都继承自为每个实体提供 id 的可识别对象
/**
* @MappedSuperclass
*/
class IdentifiableObject {
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* getters and setters go here
*/
}
然后我们有一个 User 对象,它有一个 "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
*/
}
User属性有一个属性(基本上是一种表示它是哪种用户属性的类型)和一个值
/**
* @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')";
截至今天,除了"无效的路径表达式"之外,我无法从系统中获取一些明智的东西。必须是 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)。
好的,
我似乎已经找到了一个有效的 DQL 解决方案:
$query = "SELECT user from User user WHERE user.id in(SELECT u FROM UserProperty up JOIN up.user u WHERE up.property = '$property')"
工程!(您需要在子查询中加入用户,否则您将获得可怕的"无效路径表达式"异常。