这是我的情况:
我必须是一个实体用户,有几个加入的授权收藏:
class User
{
private $id;
/**
* @var UserData
* @ORMOneToMany(targetEntity="UserData", mappedBy="user")
*/
private $userDatas;
/**
* @var ServiceAccess
* @ORMOneToMany(targetEntity="ServiceAccess", mappedBy="user")
*/
private $serviceAccesses;
...
}
serviceaccess在上也有一个OneTomany交界处,并在其 level field field 上提供了订购指令:
class ServiceAccess
{
private $id;
/**
* Offers
* @ORMOneToMany(targetEntity="Offer",
* mappedBy="access",
* cascade={"persist","remove","refresh"})
* @ORMOrderBy({"level" = "DESC"})
*/
private $offers;
/**
* @ORMManyToOne(
* targetEntity="User"
* )
* @ORMJoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
private $user;
...
}
我的报价课程:
class Offer
{
private $id;
/**
* The user access
*
* @var ServiceAccess
* @ORMManyToOne(targetEntity="FitnextServiceAccessBundleDomainEntityUserServiceAccess", inversedBy="offers")
* @ORMJoinColumn(name="access_id", referencedColumnName="id", nullable=false)
*/
private $access;
/**
* @ORMColumn(name="level", type="integer", nullable=false, options={"default"=0})
*/
private $level;
...
}
我正在实施DQL查询,以获取一个用户,其中包括其userDatas,ServiceAccesses和ServiceAccesses.offers.offers。
这里的主要窍门是 user.userdatas关头的条件:UserData具有a name 和a 创建的字段,并且可以包含具有相同 name 的几行。我的目标是查询每个定义 name 组的最新行。为此,我使用一个子查询(在stackoverflow上发送给我:)(,它可以很好地工作。
此外,我还有更多的经典连接,其中一个在用户上。ServiceAccesses,然后在serviceaccesses.offers上,当与 userdata subquery 结合使用时,这会使我出现问题。..
这是我的QueryBuilder:
// First I define the subquery for the UserDatas juncture condition
$queryDatas = $this->_em->createQueryBuilder()
->select('a')
->from('UserData', 'a')
->leftJoin( 'UserData', 'b', 'WITH', 'a.name = b.name AND a.createdAt < b.createdAt' )
->where( 'b.createdAt IS NULL' )
->andWhere('a.name IN (:names)')
->andWhere('a.user = u')
->orderBy( 'a.createdAt', 'DESC' )
->getDQL();
// Notice the orderBy clause here, which is part of the trick in order to get the latest registration of each named data group, and which is also part of the issue...
// And here is the main QueryBuilder
$this->createQueryBuilder('u')
->where('u.id = :id')
->setParameter('id', $id)
// UserDatas
->leftJoin('u.userDatas', 'd', 'WITH', 'd IN ('. $queryDatas .')')
->addSelect('d')
->setParameter('names', ['height', 'weight'])
// ServiceAccess
->leftJoin('u.serviceAccesses', 'svacc', 'WITH', 'svacc.activated = 1 AND svacc.type = :type' )
->setParameter('type','default')
->addSelect('svacc')
// ServiceAccessOffers
->leftJoin('svacc.offers', 'offers', 'WITH', 'offers.activated = 1' )
->addSelect('offers')
...
这使我返回我一个学说 dbal exception invalidfieldnameexception:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'u7_.level' in 'order clause'
这是引起问题的生成的SQL代码部分:
FROM users u0_
LEFT JOIN user_data e1_ ON u0_.id = e1_.user_id
AND (e1_.id IN (
SELECT e8_.id
FROM user_data e8_
LEFT JOIN user_data e9_ ON (e8_.name = e9_.name AND e8_.created_at < e9_.created_at)
WHERE e9_.created_at IS NULL AND e8_.name IN ('height', 'weight')
AND e8_.user_id = u0_.id
ORDER BY e8_.created_at DESC, u7_.level DESC
)
)
LEFT JOIN service_access u6_ ON u0_.id = u6_.user_id AND (u6_.activated = 1 AND u6_.type = 'default')
LEFT JOIN offer u7_ ON u6_.id = u7_.access_id AND (u7_.activated = 1)
Doctrine获取在access.offers.offers属性(Orderby Level desc(中定义的订单子句,并将其添加到子查询订单中!当然,这不知道报价表及其级别字段,因为这些都不在子查询范围内!
它的工作方式好像学说将订单添加到它在查询中找到的唯一/第一个订单,在这种情况下,该订单无法正常工作。
imo这是一个学说错误。
我目前在" symfony/symfony"下:"^3.4", "学说/orm":" 2.5.12",。
有人知道有人吗?我是第一个遇到这个问题的人吗?
非常感谢。
好吧,我现在感觉有点noob ..但是我解决了这个问题。我只是简单地重新组织了我的QueryBuilder方法,以便在>另一个之前将优惠键放置在之前,以便它在正确的位置生成第一个订单子句,而不是将其添加到子问卷中创建的一个条款中。
它有效。
仍然认为这很奇怪,因为无论是什么顺序,都应使用查询布置的方法。