我将如何在doctrine odm中从SQL模拟类似运算符?
用例:我想在变量$ search中找到字段字幕字符串中的某个主题.
查询怎么样?
谢谢你的所有答案
我在操作中嵌套多个双操作数$or操作时遇到了麻烦$and.这个讨论的结论听起来和我需要的相似,但是我无法让它发挥作用.这是我正在尝试做的JavaScript:
db.Business.find(
{
$and:
[
{ $or: [{nm: /American/}, {dsc: /American/}] },
{ $or: [{nm: /Mega/}, {dsc: /Mega/}] }
]
}
)
Run Code Online (Sandbox Code Playgroud)
这适用于MongoDB交互式shell.
这里有一些PHP对我来说没问题,但不起作用(导致无限递归,如下所示):
$q = $doctrineOdm->createQueryBuilder('Business');
foreach (array('American','Mega') as $keyword) {
$r = new \MongoRegex('/'.$keyword.'/i');
$q->addAnd(
$q->addOr($q->expr()->field('nm')->equals($r))
->addOr($q->expr()->field('dsc')->equals($r))
);
}
print_r($q->getQuery()->getQuery()); // infinite recursion
$cursor = $q->getQuery()->execute();
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
如何在doctrine mongodb odm中删除多个文档?在PHP类中,我应该可以使用以下代码来完成它:
$db->collection->remove(array("age" => 18));
Run Code Online (Sandbox Code Playgroud)
我怎么能在教义mongo odm中做到这一点?
是否可以比较当前"脏"版本(具有某些属性已更改但尚未保留的对象)与"原始"版本(数据仍在数据库中)之间的实体对象的状态.
我的假设是我可能有一个"脏"的对象,然后从数据库中提取一个新的对象并比较两者.例如:
$entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id);
$editForm = $this->createContentForm($entity);
$editForm->bind($request);
if ($editForm->isValid()) {
$db_entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id);
// compare $entity to $db_entity
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('content_edit', array('id' => $id)));
}
Run Code Online (Sandbox Code Playgroud)
但根据我的经验,$ entity和$ db_entity始终是相同的对象(并且在$ request bind形式之后具有与$ entity相同的数据).有没有办法得到一个新的版本的$实体和"脏"版本为了比较的缘故?我见过的解决方案都会在表单绑定发生之前提取所需的数据,但我宁愿没有这个限制.
更新:为了澄清,我不仅要查看实体属性的更改,还要查看其相关的实体集合.
我们正在使用Symfony2 / DoctrineOdm / MongoDB,并且在执行以下操作时:
if ($doc.referenceOne != null) { ... }
和$doc.referenceOne包含MongoDbRef点到已删除/丢失的文件,这个学说代理对象提出了MongoDBException。
可以告诉Proxy返回null而不是引发异常?
详细说明:
我们的文件:
class User {
/* @MongoDB\ReferenceOne( ... ) */
private $photo;
}
Run Code Online (Sandbox Code Playgroud)
如果$ photo包含MongoDbRef,但是文档丢失/删除,
当我们if ($user.photo) { ... }教义时会引发MongoDBException:
The "Proxies\DocumentPhotoProxy" document with identifier "4fd8b3ef732bafab7b000000" could not be found
Run Code Online (Sandbox Code Playgroud)
我们想抑制异常,因为我们的应用程序可以处理该变量中的空值。
(我们可以简单地记录该错误,而异常会传播到500页并中断我们的服务)
设置ZF2 + ODM时,我收到以下错误:
The class 'Application\Document\User' was not found in the chain configured namespaces
Run Code Online (Sandbox Code Playgroud)
当前设置如下:
ZF2稳定,通过composer.phar安装了学说ODM,其内容为composer.json
{
"name": "zendframework/skeleton-application",
"description": "Skeleton Application for ZF2",
"license": "BSD-3-Clause",
"keywords": [
"framework",
"zf2"
],
"homepage": "http://framework.zend.com/",
"minimum-stability": "dev",
"require": {
"php": ">=5.3.3",
"zendframework/zendframework": "2.0.0",
"doctrine/doctrine-mongo-odm-module": "dev-master"
}
}
Run Code Online (Sandbox Code Playgroud)
加载模块
'modules' => array(
'Application',
'DoctrineModule',
'DoctrineMongoODMModule',
),
Run Code Online (Sandbox Code Playgroud)
建立了水化器和代理dirs
$ ls -l data/DoctrineMongoODMModule/
total 0
drwxrwxrwx 2 wisu staff 68 Sep 12 08:34 Hydrators
drwxrwxrwx 2 wisu staff 68 Sep 12 08:35 Proxy
Run Code Online (Sandbox Code Playgroud)
odm配置看起来像
'driver' …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过我的本地计算机上的Zend Framework 2的作曲家安装Doctrine MongoDB ODM 模块,但我一直收到一条错误,指出我的计算机缺少PHP扩展芒果.我正在安装安装了WAMP 2.2的Windows 7 x64.我最初安装了1.3.1 mongodb php驱动程序.但是,我发现MongoDB ODM不支持这个驱动程序,所以我降级到1.2.12.我再次尝试安装后,我不断收到同样的错误:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- doctrine/mongodb 1.0.0-BETA3 requires ext-mongo >=1.3.1,<1.4-dev -> the re
quested PHP extension mongo is missing from your system.
- doctrine/mongodb 1.0.0-BETA2 requires ext-mongo >=1.2.12,<1.3-dev -> the r
equested PHP extension mongo is missing from your system.
- doctrine/mongodb 1.0.0-BETA1 requires ext-mongo * -> the requested PHP ext
ension mongo is missing …Run Code Online (Sandbox Code Playgroud) 我有以下文件:
User文件.Site文件每个用户都有嵌入文档的内部数组,每个代表他遵循着一个项目-一个网站,一个Twitter帐户-与选项标记特定类别的他感兴趣的每一嵌入文档具有第三文件的引用-该Site文件(或Twitter文件等.).
问题是-使用MongoDB的ODM,我怎么能得到所有选择跟随某个网站上的用户的文件,使用该网站的ID?
(见下文(在文件之后)如何在mongodb shell中完成)
user.php的
<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/**
* @ODM\Document
*/
class User {
/**
* @ODM\Id
* @var string
*/
protected $id;
/**
* @ODM\EmbedMany(
* discriminatorMap={
* "site"="SiteFollow",
* "twitter"="TwitterFollow",
* }
* )
* @var ArrayCollection;
*/
protected $follows;
}
Run Code Online (Sandbox Code Playgroud)
SiteFollow.php
<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/**
* @ODM\EmbeddedDocument
*/
class SiteFollow {
/**
* @ODM\Collection
* @var array
*/
protected $interestingCategories; …Run Code Online (Sandbox Code Playgroud) 我有两种类型的对象User,Company其数据存储在MongoDB集合user和中company。User包含对的引用Company。我可以在UserRepository中使用以下代码查询用户:
$this
->createQueryBuilder()
->field('employer')->references($company);
Run Code Online (Sandbox Code Playgroud)
Company但是,它是一个使用率很高的对象,使用Redis进行缓存。当不存在缓存时,一切正常。但是当从缓存中获取公司实例时。教义的工作单元不了解实例。因此,执行上面的代码将导致以下错误:
Cannot create a DBRef for class App\Document\Company without an identifier. Have you forgotten to persist/merge the document first?
Run Code Online (Sandbox Code Playgroud)
我发现从Redis提取公司信息后,我可以使用黑客将该公司注册到该工作部门:
$company = $this->fetchFromCache($params);
$documentManager->getUnitOfWork()->registerManaged($company, $company->getId(), []);
Run Code Online (Sandbox Code Playgroud)
但是,这看起来很丑。有没有一种方法可以查询用户而不必让Doctrine知道Company对象或更改我的数据模型?
doctrine-odm ×10
mongodb ×7
php ×6
doctrine-orm ×4
doctrine ×3
composer-php ×1
mongomapper ×1
nosql ×1
odm ×1
sql-like ×1
symfony ×1