You are browsing a version that is no longer maintained. |
Mapping Classes to the ORM and ODM
Because of the non-intrusive design of Doctrine, it is possible for you to have plain PHP classes that are mapped to both a relational database (with the Doctrine2 Object Relational Mapper) and MongoDB (with the Doctrine MongoDB Object Document Mapper), or any other persistence layer that implements the Doctrine Persistence persistence interfaces.
Test Subject
For this cookbook entry, we need to define a class that can be persisted to both MySQL and MongoDB.
We'll use a BlogPost
as you may want to write some generic blogging functionality that has support
for multiple Doctrine persistence layers:
Mapping Information
Now we just need to provide the mapping information for the Doctrine persistence layers so they know how to consume the objects and persist them to the database.
ORM
First define the mapping for the ORM:
1 <?php
namespace Documents\Blog;
use Documents\Blog\Repository\ORM\BlogPostRepository;
/** @Entity(repositoryClass=BlogPostRepository::class) */
class BlogPost
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $title;
/** @Column(type="text") */
private $body;
// ...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Now you are able to persist the Documents\Blog\BlogPost
with an instance of EntityManager
:
You can find the blog post:
MongoDB ODM
Now map the same class to the Doctrine MongoDB ODM:
1 <?php
namespace Documents\Blog;
use Documents\Blog\Repository\ODM\BlogPostRepository;
/** @Document(repositoryClass=BlogPostRepository::class) */
class BlogPost
{
/** @Id */
private $id;
/** @Field(type="string") */
private $title;
/** @Field(type="string") */
private $body;
// ...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Now the same class is able to be persisted in the same way using an instance of DocumentManager
:
You can find the blog post:
Repository Classes
You can implement the same repository interface for the ORM and MongoDB ODM easily, e.g. by creating BlogPostRepositoryInterface
:
Define repository methods required by the interface for the ORM:
1 <?php
namespace Documents\Blog\Repository\ORM;
use Documents\Blog\Repository\BlogPostRepositoryInterface;
use Doctrine\ORM\EntityRepository;
class BlogPostRepository extends EntityRepository implements BlogPostRepositoryInterface
{
public function findPostById(int $id): ?BlogPost
{
return $this->findOneBy(['id' => $id]);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Now define the same repository methods for the MongoDB ODM:
1 <?php
namespace Documents\Blog\Repository\ODM;
use Documents\Blog\Repository\BlogPostRepositoryInterface;
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
class BlogPostRepository extends DocumentRepository implements BlogPostRepositoryInterface
{
public function findPostById(int $id): ?BlogPost
{
return $this->findOneBy(['id' => $id]);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
As you can see the repositories are the same and the final returned data is the same vanilla PHP objects. The data is transparently injected to the objects for you automatically so you are not forced to extend some base class or shape your domain in any certain way for it to work with the Doctrine persistence layers.