Doctrine orm 第2条DQL的反向成员

Doctrine orm 第2条DQL的反向成员,doctrine-orm,dql,Doctrine Orm,Dql,我有很多关系链接和链接类的Profile类。 我需要建立DQL查询来获取某个配置文件的所有链接,而不需要反向关系链接->配置文件 第一个想法是简单地使用成员,但看起来没有直接关系是不可能的 的成员正在构建子查询sql。也许有一种方法可以做类似的事情 我不能就这么用 SELECT l FROM Profile p LEFT JOIN p.links l WHERE p.user = :user 但我可以做到: SELECT e FROM Link WHERE e.id IN (SELECT l

我有很多关系链接和链接类的Profile类。 我需要建立DQL查询来获取某个配置文件的所有链接,而不需要反向关系链接->配置文件

第一个想法是简单地使用成员,但看起来没有直接关系是不可能的

的成员正在构建子查询sql。也许有一种方法可以做类似的事情

我不能就这么用

SELECT l FROM Profile p LEFT JOIN p.links l WHERE p.user = :user
但我可以做到:

SELECT e FROM Link WHERE e.id IN (SELECT l FROM Profile p LEFT JOIN p.links l WHERE p.user = :user)
因此,我生成了以下SQL:

SELECT ... FROM Link t0_ 
   WHERE t0_.id IN (
      SELECT t1_.id FROM Profile a2_ 
      LEFT JOIN profile_link p3_ ON a2_.user_id = p3_.profile_user_id 
      LEFT JOIN Link t1_ ON t1_.id = p3_.link_id 
      WHERE a2_.user_id = ?
   )

是否有任何方法可以直接构建子查询到表profile\u链接,而无需profile连接

比如:

SELECT ... FROM Link t0_ 
   WHERE t0_.id IN (
      SELECT l.link_id FROM profile_link l 
      WHERE l.profile_id = :user
   )

另外,无需使用配置文件表

profile_link.profile_id = profile.user_id = user.id = :user

我需要一个DQL查询生成器来构建更复杂的查询,并支持筛选/排序/分组。我不能在这里使用本机查询或修改实体类。也许某种定制的DQL函数可以解决这个问题。

我相信你想得太多了

您可以通过定义的链接关系获取纵断面图元的链接

我假设您的Profile类如下所示:

use Doctrine\ORM\Mapping as ORM;

class Profile
{
    /**
     * @var integer
     *
     * @ORM\Column(name="user_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
     private $id;

     /**
      * @ORM\ManyToMany(targetEntity="Link")
      * @ORM\JoinTable(name="profile_link",
      *      joinColumns={@ORM\JoinColumn(name="profile_user_id", referencedColumnName="user_id")},
      *      inverseJoinColumns={@ORM\JoinColumn(name="link_id", referencedColumnName="id")}
      *      )
      **/
     protected $links;

     public function getLinks()
     {
         return $this->links;
     }
您可以通过以下方式实现您的目标:

加载配置文件实体 获取链接关系 遍历返回的集合(取决于eager、lazy或extra-lazy),如果尚未从上述步骤中提取实体,则会导致提取实体。 在控制器中,只需执行以下操作:

$profile = $em->getRepository('AppBundle\Entity\Profile')->find(1);
$links = $profile->getLinks();
foreach($links as $link) {
    echo $link->getId();
}
这样将执行2个查询:

1获取配置文件行,例如:

SELECT t0.user_id AS user_id_1 FROM profile t0 WHERE t0.user_id = ?
2获取相关链接,例如:

SELECT t0.id AS id_1 FROM link t0 INNER JOIN profile_link ON t0.id = profile_link.link_id WHERE profile_link.profile_user_id = ?
在最后一个查询中,只连接映射表,而不连接Profiles表。返回的行不包含配置文件数据。

我放弃

ManyToMany realtion是一对简单的OneToMany realtion,所以我创建了一个类来表示它

class ProfileLink{

    /** 
     * @ORM\Id
     * @ORM\OneToMany(targetEntity="Profile")
     */
    protected $profile;


    /** 
     * @ORM\Id
     * @ORM\OneToMany(targetEntity="Link")
     */
    protected $link;
}
现在我可以在链接类上使用DQL而不使用反向部分


谢谢你的回复,你是对的。这是正确的SQL查询,但我需要分组/排序/分页支持,仅在DQL查询生成器中可用。所以我在寻找DQL解决方案。
SELECT p FROM ProfileLink LEFT JOIN p.link WHERE p.profile = :user_id;