php 无法规范化查询:BadValue $或/$和/$或条目必须是完整对象-原则

cclgggtu  于 2022-11-28  发布在  PHP
关注(0)|答案(3)|浏览(131)

我正试图隐藏这个问题

db.getCollection('queues').find({
    $and:[
        {queue: 'testo'},
        {$or: [
            {$and: [{reserved_at: null}, {available_at:{'$lte':1490323024}}]},
            {reserved_at:{'$lte':1490323024}}
        ]}
    ]
});

但我得到了这个错误。

Can't canonicalize query: BadValue $or/$and/$nor entries need to be full objects.

这就是我所尝试的。

$builder = $this->get('doctrine_mongodb')->getManager()->createQueryBuilder('AppBundle:Ticket');

$builder->findAndUpdate()->addAnd([
    $builder->field('queue')->equals($queue),
    $builder->addOr([
        $builder->addAnd([
            $builder->field('reservedAt')->equals(null),
            $builder->field('availableAt')->lte($currentTime)
        ]),
        $builder->field('reservedAt')->lte($expiration)
    ])
])
->sort('id', 'ASC')
->limit(1)
->field('reservedAt')->set($currentTime->getTimestamp());

$job = $builder->getQuery()->execute()->toArray();

这个代码有什么问题吗?有人能给予我任何提示吗?

wqsoz72f

wqsoz72f1#

我不熟悉Doctrine的ODM,但由于它有一个QueryBuilder,我假设它也有一个类似于ORM-QueryBuilder的方法expr()
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class
使用expr-class,您可以建立巢状查询,如下所示:

->where(
    $builder->expr()->or(
        $builder->expr()->and(
            $builder->expr()->isNull('reservedAt'),
            $builder->expr()->lte('availableAt', $currentTime),
        ),
        $builder->expr()->lte('reservedAt', $expirationDate)
    )
);
5uzkadbs

5uzkadbs2#

这是因为您要将嵌套条件添加到原始QueryBuilder对象中。即使您使用带有嵌套参数的addAnd和addOr方法,您仍然在改变顶级构建器,因此它会对您要对这些条件执行的操作感到困惑。
请尝试以下操作:

$builder
    ->findAndUpdate()
    ->addAnd([
        $builder->expr()->field('queue')->equals($queue),
        $builder->expr()->addOr([
            $builder->expr()->addAnd([
                $builder->expr()->field('reservedAt')->equals(null),
                $builder->expr()->field('availableAt')->lte($currentTime)
            ]),
            $builder->expr()->field('reservedAt')->lte($expiration)
        ])
    ]);

了解expr()的作用非常重要,它只是一个简单的工厂方法,用于创建与调用它的构建器对象 * 无关 * 的Expression对象。

$builder->expr()

相当于

(new Expr())

addAnd和addOr方法将所有东西紧密地联系在一起。expr()方法的存在只是为了让querybuilder的维护者担心Expression的类和依赖注入,但对于不太了解构建器的人来说,它可能会混淆expr()方法的重要性。

9bfwbjaz

9bfwbjaz3#

我有类似的问题,坏值whle应用$or和$和一起只是举一个例子,我的代码,它可能会帮助你,它是解决了,而解决$条件数组:

$condition['$or'] = [
            ['assigned_to' => (int)$id,
                'type' => "customer",
                'assigned_date' => ['$gte'=>$mDate],
            ],
            ['assigned_to' => 0,
                'read' => 'no',
                'type' => "customer",
                'assigned_date' => ['$gte'=>$mDate],
            ]
        ];

问题只在数组的形式。我用Mongo与PHP类。

相关问题