【问题标题】:SQL LITE + SYMFONY TESTING: SQLSTATE[HY000]: General error: 1 near ONSQLITE + SYMFONY 测试:SQLSTATE[HY000]:一般错误:1 接近 ON
【发布时间】:2017-10-27 09:20:10
【问题描述】:

我正在使用 symfony+sqllite 来测试我的应用程序,但我遇到了 ORM 问题。 Doctrine 在 JOIN 中生成带有双 ON 的 sql,类似于:

选择 s0_.config AS config_0, s0_.sensor_number AS sensor_number_1 FROM 传感器 s0_ 左连接 fos_user f1_ 左连接工人 w2_ ON f1_.id = w2_.id LEFT JOIN 经销商 d3_ ON f1_.id = d3_.id ON (s0_.owner_id = f1_.id) AND (f1_.status != 'd') LEFT JOIN user_groups u4_ ON (f1_.user_group_id = u4_.id) AND (u4_.status != 'd') WHERE (s0_.status = ?和 u4_.id = ? AND ((s0_.device_id IS NULL OR s0_.device_id = ?))) AND ((select user_group_id from fos_user where id = s0_.owner_id) = '1') AND (s0_.status != 'd')

它是关于:

ON f1_.id = d3_.id ON (s0_.owner_id = f1_.id)

导致错误:

SQLSTATE[HY000]: 一般错误: 1 near \"ON\": syntax error","class":"Doctrine\DBAL\Exception\SyntaxErrorException"

我检查过,我知道 SQLite 不能使用多个“ON”(postgresSQL 有效),那么为什么在运行测试时教义会生成它。

对此负责的 Symfony 表单:

$builder->add(
            'sensors',
            EntityType::class,
            [
                'class' => Sensors::class,
                'label' => 'form.assigned-sensors',
                'required' => false,
                'multiple' => true,
                'by_reference' => false,
                'query_builder' => function (EntityRepository $er) use ($device, $userGroup) {
                    $qb = $er->createQueryBuilder('s')
                        ->leftJoin(User::class, 'o', 'WITH', 's.owner = o.id')
                        ->leftJoin(UserGroups::class, 'g', 'WITH', 'o.userGroup = g.id')
                        ->where('s.status = :status')
                        ->andWhere('g.id = :userGroupId')
                        ->andWhere('(s.device is null or s.device = :deviceId)')
                        ->setParameter('status', 'a')
                        ->setParameter('deviceId', $device->getId())
                        ->setParameter('userGroupId', $userGroup->getId());

                    return $qb;
                },
            ]
        );

编辑:

最后我发现了我在下面的回答中描述的问题。感谢您的宝贵时间。

【问题讨论】:

  • LEFT JOIN tab4 d3_ ON f1_.id = d3_.id ON (s0_.o你有一个没有加入的人
  • 提供负责运行此查询的 PHP 代码。
  • LEFT JOIN tab4 d3_ ON f1_.id = d3_.id ON - 它适用于 postgressql
  • 我已添加生成此查询的表单。

标签: sqlite symfony doctrine-orm


【解决方案1】:

我终于在这张票中找到了问题:

https://stackoverflow.com/a/15088250/6357312

没有必要这样做:

->leftJoin(User::class, 'o', 'WITH', 's.owner = o.id')

应该只是:

->leftJoin('s.owner', 'o')

实体已在此关系上定义了与所选实体建立关系的表。

最后这段代码看起来像:

$builder->add(
            'sensors',
            EntityType::class,
            [
                'class' => Sensors::class,
                'label' => 'form.assigned-sensors',
                'required' => false,
                'multiple' => true,
                'by_reference' => false,
                'query_builder' => function (EntityRepository $er) use ($device, $userGroup) {
                    $qb = $er->createQueryBuilder('s')
                        ->leftJoin('s.owner', 'o')
                        ->leftJoin('o.userGroup', 'g')
                        ->andWhere('g.id = :userGroupId')
                        ->andWhere('(s.device is null or s.device = :deviceId)')
                        ->setParameter('userGroupId', $userGroup->getId())
                        ->setParameter('deviceId', $device->getId());

                    return $qb;
                },
            ]
        );

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2012-10-24
    • 2018-06-18
    • 1970-01-01
    • 2012-10-25
    • 2014-12-31
    • 2019-01-04
    相关资源
    最近更新 更多