【问题标题】:Check if an array contains an element returns an array only with searched element in doctrine query builder检查数组是否包含元素返回仅在教义查询生成器中搜索元素的数组
【发布时间】:2022-08-04 17:13:19
【问题描述】:

我正在处理以下情况:

我的 ChatRoom 类包含一组用户:

    #[ORM\\ManyToMany(targetEntity: User::class)]
    #[Groups([ChatRoom::GROUP_GET])]
    private iterable $users;

我添加了一个扩展,它应该添加到集合操作查询中:

$queryBuilder
     ->leftJoin(\"$rootAlias.users\", \'us\')
     ->andWhere(\'us IN (:current_user)\')
     ->setParameter(\'current_user\', array($user->getId()));

这将返回正确的聊天室,但在用户数组中,我只会得到我正在搜索的那个,而不是所有存储在数据库中的。

知道如何解决这个问题..?

  • 运行 echo $queryBuilder->getQuery()->getSQL(); 并检查它是否正在生成预期的 SQL 查询。另外,您可以尝试$queryBuilder->setParameter(\'current_user\', [$user]);,但我不确定。
  • 它没有生成预期的 SQL 查询。join 和 where 子句如下所示: LEFT JOIN chat_room_user c3_ ON c0_.id = c3_.chat_room_id LEFT JOIN \"user\" u2_ ON u2_.id = c3_.user_id AND (u2_.deleted_at IS NULL) WHERE (u2_.id IN (?)) (其中 c0_ 是我的聊天室表)。 where id 子句应该在多对多关系表上。任何想法如何告诉教义这样做..?

标签: php sql symfony doctrine


【解决方案1】:

我没有清楚地理解您要做什么。

如果您需要获取当前聊天室的所有用户,那么如果您有多对多的聊天室-用户关系,则不需要扩展。你已经有了。

如果您需要获取用户的所有聊天室,则需要 user-chatRoom 关系(通过相同的 chat_rooms_users 表)。

有了这些关系,您可以调用 getChatRooms() 和 getUsers() 方法。所有这些功能都可以通过标准的 Doctrine 关系获得。

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2016-10-13
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多