从连接查询中获取父实体

Get the parent entities from a join query

我在 user_has_client 子实体和 client 父实体之间存在多对一关系。

这里是 user_has_client table:

MariaDB [extrapack]> desc user_has_client;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
+-----------+------------------+------+-----+---------+-------+

我想从涉及 user_has_client 个子实体的 user_id 的查询中 return client 个父实体的列表。

我第一次尝试这个:

 $query = $this->getEntityManager()->createQueryBuilder()
 ->select('c')
 ->from('Application\Entity\UserHasClient', 'uc')
 ->innerJoin('uc.client', 'c')
 ->where('uc.user_id = :user_id')
 ->setMaxResults(10)
 ;
 $query->setParameters(array('user_id' => $user_id));

它给了我以下错误:

[Semantical Error] line 0, col -1 near 'SELECT c
   ': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

然后试了这个:

$query = $this->getEntityManager()->createQuery(
    "SELECT c.client_id
    FROM Application\Entity\UserHasClient u
    INNER JOIN u.client c
    WHERE u.user_id = {$user_id}");

它给了我同样的错误:

Semantical Error] line 0, col -1 near 'SELECT c FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

我在客户端发现了用户 属性,这意味着关系是双向的。

所以我可以通过以下查询访问数据:

$query = $this->getEntityManager()->createQueryBuilder()
->select('c')
->from('Application\Entity\Client', 'c')
->innerJoin('c.users', 'u')
->andWhere("u.user_id = {$user_id}")
->orderBy('c.title', 'ASC')
->setMaxResults(10);
return $query->getQuery()->getArrayResult();

如果关系是双向的,您可以使用这样的查询:

$query = $this->getEntityManager()->createQueryBuilder()
    ->select('c')
    ->from('Application\Entity\Client', 'c')
    ->innerJoin('c.userHasClient', 'uc')
    ->where('uc.user_id = :user_id')
    ->setMaxResults(10);
$query->setParameters(array('user_id' => $user_id));