使用其他字段的值更新字段
update a field with the value of other field
如何用其他字段的值更新一个字段?
例如,我想用字段 created_at 的值更新字段 updated_at (这就像克隆字段)
$dm->createQueryBuilder('MyBundle:MyService')
->update()
->multiple(true)
->field('updated_at')->set(CREATED_AT_ATRIBUTE)
->getQuery()
->execute();
谢谢
选项 #1:应用程序端更新
使用 Doctrine ODM 时最简单的方法是在应用程序端执行更新。因此,您获取所有要更新的对象,进行必要的调整并刷新它们。
$services = $dm->createQueryBuilder('MyBundle:MyService')
->getQuery()
->execute();
foreach ($services as $service) {
$service->setUpdatedAt($service->getCreatedAt());
}
$db->flush();
$services
代表 mongo 游标,它将在您迭代时获取文档。如果您想一次从集合中获取所有文档,可以将 eagerCursor
设置为 true
。
选项 #2:数据库端更新
您也可以直接对数据库本身执行更新。但是,要这样做,您需要自己创建查询,因为查询构建器不支持此功能。
// Get MongoDB instance from DocumentManager
$mongo = $dm->getDocumentDatabase('Fully/Qualified/Class/Name')
->getMongoDB();
// Iterate over the collection and update each document
$mongo->execute('
db.MyServiceCollection.find().forEach(function (item) {
db.MyServiceCollection.update(
{_id: item._id},
{$set: {updated_at: item.created_at}}
);
});
');
forEach
中使用的函数只是一个常规的 javascript 函数,因此如果您需要对更新的内容进行更多控制,可以在其中插入更多逻辑。
如何用其他字段的值更新一个字段? 例如,我想用字段 created_at 的值更新字段 updated_at (这就像克隆字段)
$dm->createQueryBuilder('MyBundle:MyService')
->update()
->multiple(true)
->field('updated_at')->set(CREATED_AT_ATRIBUTE)
->getQuery()
->execute();
谢谢
选项 #1:应用程序端更新
使用 Doctrine ODM 时最简单的方法是在应用程序端执行更新。因此,您获取所有要更新的对象,进行必要的调整并刷新它们。
$services = $dm->createQueryBuilder('MyBundle:MyService')
->getQuery()
->execute();
foreach ($services as $service) {
$service->setUpdatedAt($service->getCreatedAt());
}
$db->flush();
$services
代表 mongo 游标,它将在您迭代时获取文档。如果您想一次从集合中获取所有文档,可以将 eagerCursor
设置为 true
。
选项 #2:数据库端更新
您也可以直接对数据库本身执行更新。但是,要这样做,您需要自己创建查询,因为查询构建器不支持此功能。
// Get MongoDB instance from DocumentManager
$mongo = $dm->getDocumentDatabase('Fully/Qualified/Class/Name')
->getMongoDB();
// Iterate over the collection and update each document
$mongo->execute('
db.MyServiceCollection.find().forEach(function (item) {
db.MyServiceCollection.update(
{_id: item._id},
{$set: {updated_at: item.created_at}}
);
});
');
forEach
中使用的函数只是一个常规的 javascript 函数,因此如果您需要对更新的内容进行更多控制,可以在其中插入更多逻辑。