如何使用Doctrine ODM创建一对一的双向引用,在使用除主键之外的字段进行引用时延迟加载?
我在MongoDB中有两个文档,Article和ArticleMetaData.对于每个文章文档,都有一个ArticleMetaData,反之亦然.(OneToOne双向关系.)由于遗留原因,这两种文档类型需要位于不同的集合中.两个集合都由不了解Mongo ID的外部系统更新.然而,它们包含共享字段"groupcode",可用于将正确的文章与其元数据相匹配.
我尝试以这样的方式配置Doctrine,即我可以从其元数据对象获取文章对象和文章的元数据,但我想让它们延迟加载.(当我不需要时,不需要查询另一端.)
映射如下:
Foo\BarBundle\Document\Article:
repositoryClass: Foo\BarBundle\Repository\ArticleRepository
changeTrackingPolicy: DEFERRED_EXPLICIT
collection: article
type: document
fields:
id:
id: true
groupcode:
type: int
index: true
unique:
order: asc
...
referenceOne:
metaData:
targetDocument: Foo\BarBundle\Document\ArticleMetaData
mappedBy: groupcode
repositoryMethod: findOneByArticle
Foo\BarBundle\Document\ArticleMetaData:
repositoryClass: Foo\BarBundle\Repository\ArticleMetaDataRepository
changeTrackingPolicy: DEFERRED_EXPLICIT
collection: article_meta
fields:
id:
id: true
groupcode:
type: int
index: true
unique:
order: asc
...
referenceOne:
article:
targetDocument: Foo\BarBundle\Document\Article
mappedBy: groupcode
repositoryMethod: findOneByMetaData
Run Code Online (Sandbox Code Playgroud)
以及上面提到的存储库方法:
// In the ArticleRepository
public function findOneByMetaData(ArticleMetaData $metadata)
{
$article = $this
->createQueryBuilder()
->field('groupcode')->equals($metadata->getGroupcode())
->getQuery() …
Run Code Online (Sandbox Code Playgroud) 我使用Symfony2和RabbitMqBundle来创建一个向ElasticSearch发送文档的worker.以一对一的速率索引文档比使用ElasticSearch批量API慢得多.因此,我创建了一个缓冲区,以1000个为一组将文档刷新到ES.代码看起来(稍微简化)如下:
class SearchIndexator
{
protected $elasticaService;
protected $buffer = [];
protected $bufferSize = 0;
// The maximum number of documents to keep in the buffer.
// If the buffer reaches this amount of documents, then the buffers content
// is send to elasticsearch for indexation.
const MAX_BUFFER_SIZE = 1000;
public function __construct(ElasticaService $elasticaService)
{
$this->elasticaService = $elasticaService;
}
/**
* Destructor
*
* Flush any documents that remain in the buffer.
*/
public function __destruct()
{
$this->flush();
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可以解析由大写单词后跟零个或多个封装在双引号中的参数组成的字符串的函数。
例如,以下每一行:
COPY "filename one" "filename two"
REMOVE "filename"
LIST "x" "y" "z"
DISCONNECT
Run Code Online (Sandbox Code Playgroud)
结果应该是一个字符串(命令),后跟一个字符串[](引号内的参数)。我创建了以下正则表达式:
re1, _ := regexp.Compile(`([A-Z]+)(?: "([^"]+)")*`)
results := re1.FindAllStringSubmatch(input, -1)
Run Code Online (Sandbox Code Playgroud)
然而,无论我如何尝试,只有最后一个参数被捕获。
我的问题的一个例子:https ://play.golang.org/p/W1rE1X4SWf5
"arg1"
本例中未捕获。我缺少什么?
我有两种类型的对象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对象或更改我的数据模型?
在启动Symfony2内核后,如何在bundle中执行某些代码?
我需要这个的原因是我需要注册一个流包装器.我需要能够使用bundle配置,因为流包装器定义是在config中定义的.
我尝试了以下方法:
kernel.request
和创建事件侦听器console.command
(当内核在其生命周期内处理多个请求时,这将导致代码多次执行.)我有以下PHPUnit测试用例:
$mailer = $this->getMockBuilder(MailerInterface::class)->getMock();
$simpleMailer = new SimpleMailer($mailer);
$message = (new Message())
->setTo($user)
->setFrom($from)
->setSubject($subject)
->setTemplate(SimpleMailer::TEMPLATE)
->setContext(['message' => $body]);
if ($bcc) { $message->addBcc($bcc); }
$mailer
->expects($this->once())
->method('send')
->with($this->equalTo($message));
$simpleMailer->sendMessage($user, $subject, $body, $from, $bcc);
Run Code Online (Sandbox Code Playgroud)
在更改Message类之前,此方法一直工作良好。Message类现在在构造上设置一个唯一的ID,这意味着它equalTo
现在返回false,具有以下区别:
MailerBundle\Document\Message Object (
- 'id' => '5a372f3c-a8a9-4e1e-913f-d756244c8e52'
+ 'id' => '11176427-7d74-4a3c-8708-0026ae666f8b'
'type' => null
'user' => Tests\TestUser Object (...)
'toName' => ''
'toAddress' => null
'domain' => null
'fromName' => null
'fromAddress' => 'user@example.org'
'bccAddresses' => Array (...)
'subject' => 'subject'
'textBody' => null …
Run Code Online (Sandbox Code Playgroud) 该mongo
PHP扩展赞成不赞成的mongodb
扩展。此扩展名与一起使用mongo-php-library
。
在旧扩展中,可以使用MongoCursor :: count()从光标获取结果计数。但是,新游标MongoDB \ Driver \ Cursor没有这种方法。对MongoDB执行查询后,从中获取结果数量的新方法是什么?
php ×7
symfony ×3
doctrine-odm ×2
mongodb ×2
composer-php ×1
doctrine ×1
doctrine-orm ×1
go ×1
package ×1
pear ×1
php-mongodb ×1
phpunit ×1
rabbitmq ×1
reactphp ×1
regex ×1