更新:非常肯定这是一个错误,在Jira上发了一个问题:http
: //bit.ly/gpstW9 更新(2011年5月5日):根据jwage的推荐,我已经切换到类别和帖子之间的参考关系(而不是嵌入式).
我正在使用最新版本的Doctrine ODM(Git新增).
我有三个层次的文件(两个嵌入式); 类别 - > EmbedsMany:Post - > EmbedsMany PostVersion.
PostVersion由Post自动处理.当我发布一个新帖子时,它实际上也是一个新的PostVersion.
我的问题是Doctrine与PostVersions混淆,如果我检索现有的Category并添加一个新帖子,新Post的PostVersions会添加到Category的$ posts集合中的第一个Post.
一步步:
在数据库的这个阶段,应该有一个类别,两个帖子,每个帖子都有一个PostVersion.然而,实际发生的是有一个类别,两个帖子,第一个帖子有两个PostVersions,第二个Post有零PostVersions.
请求期间的文档本身是正确的,它只是希望持久化到错误的数据库.我错过了什么?
预期结果:
{
"_id": ObjectId("4da66baa6dd08df1f6000001"),
"name": "The Category",
"posts": [
{
"_id": ObjectId("4da66baa6dd08df1f6000002"),
"activeVersionIndex": 0,
"versions": [
{
"_id": ObjectId("4da66baa6dd08df1f6000003"),
"name": "One Post",
"content": "One Content",
"metaDescription": null,
"isAutosave": false,
"createdAt": "Thu, 14 Apr 2011 13:36:10 +1000",
"createdBy": "Cobby"
}
]
},
{
"_id": ObjectId("4da66baa6dd08df1f6000004"),
"activeVersionIndex": 0
"versions": [
{ …Run Code Online (Sandbox Code Playgroud) 我在文档User中引用了一个文档Person.当我检索User时,它没有嵌入Person对象,而是Person代理对象.有没有办法"强制"代理成为"完整"文档(所以Person proxy => Person).
我已经尝试调用一个方法来检索其他数据(因此__load被触发,但对象仍然是'代理'版本.
我希望有人能够比ODM的文件更能说清楚这一点.
除了使用之外,还有更好的方法将doctrine2 ODM实体类中的数据绑定到Zend2表单bind()吗?
如果是这样,会是什么?我只是将数据检索为数组并传递每个字段吗?我正在努力解决这个问题,并且最有可能使它变得比它需要的更难.
当我调用该bind()函数时,它会输出一个引用默认水化器的Zend错误.我是否需要在我的实体类中做一些特别的事情?
编辑:以下是Zend投掷的确切错误
〜\厂商\ zendframework\zendframework \库\ Zend的\ STDLIB \保湿\ ArraySerializable.php:35
Zend\Stdlib\Hydrator\ArraySerializable :: extract期望提供的对象实现getArrayCopy()
他们让我认为我需要:
我有一个任意MongoDB JSON查找查询字符串,例如:
{ "address.city": "Seattle"}
Run Code Online (Sandbox Code Playgroud)
要么
{ qty: { $gt: 5, $lt: 50 }
Run Code Online (Sandbox Code Playgroud)
是否有任何现有方法从JSON字符串创建Doctrine.MongoDB.Query对象?或者直接查询mongo然后将这些结果传递给学说进行补水?
我在我的项目中使用zf2身份验证验证用户.我在我的用户表中将Harib保存为用户名,但如果我使用我的用户名Harib然后接受或者如果我使用harib然后它不接受,我想删除用户的区分大小写这个名字让Harib或harib访问我如何解决这个问题?
这是我的代码:
public function loginAction()
{
$this->layout('layout/login-layout.phtml');
$login_error = false;
$loginForm = new LoginForm();
$form_elements = json_encode($loginForm->form_elements);
if ($this->request->isPost()) {
$post = $this->request->getPost();
$loginForm->setData($post);
if ($loginForm->isValid()) {
$hashed_string = '';
if(
array_key_exists('hashed_input' , $post) &&
$post['hashed_input'] != '' &&
strpos(urldecode($this->params('redirect')) , 'programdetailrequest') !== false
) {
$hashed_string = $post['hashed_input'];
}
$data = $loginForm->getData();
$authService = $this->getServiceLocator()->get('doctrine.authenticationservice.odm_default');
$adapter = $authService->getAdapter();
$adapter->setIdentityValue($data['username']);
$adapter->setCredentialValue(md5($data['password']));
$authResult = $authService->authenticate();
if($authResult->isValid()){
$identity = $authResult->getIdentity();
if( is_object($identity) && method_exists($identity, 'getData') ){
$user_data = $identity->getData();
$authService->getStorage()->write($identity);
// for …Run Code Online (Sandbox Code Playgroud) php authentication doctrine-orm doctrine-odm zend-framework2
我在操作中嵌套多个双操作数$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)
有任何想法吗?
我正在尝试将zf2 beta3与doctrine mongo odm(https://github.com/doctrine/DoctrineMongoODMModule)集成,但没有成功.
我该如何安装和配置它?
doctrine zend-framework doctrine-orm doctrine-odm zend-framework2
我有一个嵌入了文档的文档.当我第一次创建一个对象时,一切正常,但是当我尝试更新文档时,嵌入的文档不会更新.
/** @MongoDB\Document */
class DocumentA
{
/** @MongoDB\EmbedOne(targetDocument="DocumentB") **/
protected $docB;
/** @MongoDB\String */
protected $valueA;
}
/** @MongoDB\EmbeddedDocument */
class DocumentB
{
/** @MongoDB\String */
protected $valueB;
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我查询文档,更新值并将它们保存到数据存储中.
// Variant A – Does not work
$document = ... // find from data store
$document->setValueA('Hello World');
$document->getDocB()->setValueB('foo baz');
$om->persist($document);
$om->flush();
Run Code Online (Sandbox Code Playgroud)
如果我不更新嵌入式文档,但设置一个新文件一切正常:
// Variant B - Does work
$document = ... // find from data store
$document->setValueB('Hello World 2');
$document->setDocB(new DocumentB());
$document->getDocB()->setValueB('foo baz 2');
$om->persist($document);
$om->flush();
Run Code Online (Sandbox Code Playgroud)
正如我所说,变体B的工作正常.但是,在我的应用程序中,文档更复杂,每次我必须更新它时,为嵌入式文档创建一个新对象是不切实际的.有没有一种方法可以告诉Doctrine ODM查看嵌入式文档的值以决定是否应该更新它?
我正在使用symfony2和mongodb,直到今天,一切正常,但是我创建了一个新文档,突然出现了这个错误:
"MongoException:不允许使用零长度键,你是否使用带双引号的$?"
$dm = $this->get('doctrine.odm.mongodb.document_manager');
$_repo = $dm->getRepository('CantaoCustomerBundle:CustomerTags');
$_repo->findOneByCustomer($customer);
Run Code Online (Sandbox Code Playgroud)
在$customer它的确定,资源库是空的,我的文档类是这样的:
/**
* @MongoDB\ID
**/
private $id;
/**
* @MongoDB\ReferenceOne(targetDocument="Tapronto\Mats\ProductBundle\Document\Tag", cascade={"persist"})
**/
private $tag;
/**
* @MongoDB\ReferenceOne(targetDocument="Tapronto\Mats\CustomerBundle\Document\Customer", cascade={"persist"})
**/
private $customer;
/**
* @MongoDB\Float
**/
private $points;
/**
* @MongoDB\Int
**/
private $viewed;
/**
* @MongoDB\Int
**/
private $brought;
/**
* @MongoDB\Int
**/
private $favorited;
/**
* @MongoDB\Date
* @Gedmo\Timestampable(on="create")
**/
private $createdAt;
/**
* @MongoDB\Date
* @Gedmo\Timestampable(on="update")
**/
private $updatedAt;
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我,有一些想法,我尝试了一切,似乎没有任何工作
我有一个使用Doctrine MongoDB ODM的Symfony 2应用程序,我正在尝试使用PHP 7运行它.
我已经成功安装了PHP 7,但是通过Composer安装依赖项让我感到悲伤,出现以下错误:
doctrine/mongodb 1.0.x-dev requires ext-mongo >=1.2.12,<1.7-dev -> the requested PHP extension mongo is missing from your system.
Run Code Online (Sandbox Code Playgroud)
我设法通过apt安装PHP 7 mongo扩展:
apt-get install php7.0-mongo
Run Code Online (Sandbox Code Playgroud)
为了确定,我还mongodb通过PECL 安装了扩展:
sudo apt-get install -y php-pear php7.0-dev libcurl3-openssl-dev
sudo pecl install mongodb
Run Code Online (Sandbox Code Playgroud)
但是,我仍然得到无法找到mongo扩展名的错误.似乎存在版本差异,ext-mongo >=1.2.12但只是1.1.6安装了::
$ php -i | grep mongo
/etc/php/7.0/cli/conf.d/20-mongodb.ini,
mongodb
mongodb support => enabled
mongodb version => 1.1.6
mongodb stability => stable
libmongoc version => 1.3.5
mongodb.debug => no value => no …Run Code Online (Sandbox Code Playgroud) doctrine-odm ×10
mongodb ×6
php ×5
doctrine ×4
doctrine-orm ×3
symfony ×3
composer-php ×1
php-7 ×1