ZF4 (Laminas) : Setup MongoDb (Part 2 : OEM)
..
Step 1. สร้างคลาส Model ไว้ใน Application/Model/Mongo/Documents
Address.php
<?php
namespace Application\Model\Mongo\Documents;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/** @ODM\EmbeddedDocument */
class Address {
/** @ODM\Field(type="string") */
private $address;
/** @ODM\Field(type="string") */
private $city;
/** @ODM\Field(type="string") */
private $state;
/** @ODM\Field(type="string") */
private $zipcode;
public function getAddress(): ?string {
return $this->address;
}
public function setAddress(string $address): void {
$this->address = $address;
}
public function getCity(): ?string {
return $this->city;
}
public function setCity(string $city): void {
$this->city = $city;
}
public function getState(): ?string {
return $this->state;
}
public function setState(string $state): void {
$this->state = $state;
}
public function getZipcode(): ?string {
return $this->zipcode;
}
public function setZipcode(string $zipcode): void {
$this->zipcode = $zipcode;
}
}
BaseEmployee.php
<?php
namespace Application\Model\Mongo\Documents;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use DateTime;
/** @ODM\MappedSuperclass */
abstract class BaseEmployee {
/** @ODM\Id */
private $id;
/** @ODM\Field(type="int", strategy="increment") */
private $changes = 0;
/** @ODM\Field(type="collection") */
private $notes = [];
/** @ODM\Field(type="string") */
private $name;
/** @ODM\Field(type="int") */
private $salary;
/** @ODM\Field(type="date") */
private $started;
/** @ODM\Field(type="date") */
private $left;
/** @ODM\EmbedOne(targetDocument=Address::class) */
private $address;
public function getId(): ?string {
return $this->id;
}
public function getChanges(): int {
return $this->changes;
}
public function incrementChanges(): void {
$this->changes++;
}
public function getNotes(): array {
return $this->notes;
}
public function addNote($note) {
$this->notes[] = $note;
}
public function getName(): ?string {
return $this->name;
}
public function setName(string $name): void {
$this->name = $name;
}
public function getSalary(): ?int {
return $this->salary;
}
public function setSalary(int $salary): void {
$this->salary = (int) $salary;
}
public function getStarted(): ?DateTime {
return $this->started;
}
public function setStarted(DateTime $started) {
$this->started = $started;
}
public function getLeft(): ?DateTime {
return $this->left;
}
public function setLeft(DateTime $left) {
$this->left = $left;
}
public function getAddress(): ?Address {
return $this->address;
}
public function setAddress(Address $address): void {
$this->address = $address;
}
}
Employee.php
<?php
namespace Application\Model\Mongo\Documents;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/** @ODM\Document */
class Employee extends BaseEmployee {
/** @ODM\ReferenceOne(targetDocument=Manager::class) */
private $manager;
public function getManager(): ?Manager {
return $this->manager;
}
public function setManager(Manager $manager): void {
$this->manager = $manager;
}
}
Manager.php
<?php
namespace Application\Model\Mongo\Documents;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/** @ODM\Document */
class Manager extends BaseEmployee {
/** @ODM\ReferenceMany(targetDocument=Project::class) */
private $projects;
public function __construct() {
$this->projects = new ArrayCollection();
}
public function getProjects(): Collection {
return $this->projects;
}
public function addProject(Project $project): void {
$this->projects[] = $project;
}
}
Project.php
<?php
namespace Application\Model\Mongo\Documents;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/** @ODM\Document */
class Project {
/** @ODM\Id */
private $id;
/** @ODM\Field(type="string") */
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getId(): ?string {
return $this->id;
}
public function getName(): ?string {
return $this->name;
}
public function setName(string $name): void {
$this->name = $name;
}
}
Step 2. ไปที่คลาส Controller เพิ่มส่วนหัวดังนี้
use MongoDB\Client;
use Doctrine\ODM\MongoDB\Configuration;
use Doctrine\ODM\MongoDB\DocumentManager;
use Interop\Container\ContainerInterface;
use Application\Model\Mongo\Documents\Project;
use Application\Model\Mongo\Documents\Manager;
use Application\Model\Mongo\Documents\Employee;
use Application\Model\Mongo\Documents\BaseEmployee;
use Application\Model\Mongo\Documents\Address;
use DateTime;
use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver;
Step 3. ในคลาส Controller ไปที่ Action ที่ต้องการแสดงผล เพิ่มส่วนหัวดังนี้
try {
$m = new Client('mongodb://127.0.0.1:27017', ["username" => "root", "password" => "abc123"], ['typeMap' => DocumentManager::CLIENT_TYPEMAP]);
$config = new Configuration();
$config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Proxies');
$config->setHydratorDir(__DIR__ . '/Hydrators');
$config->setHydratorNamespace('Hydrators');
$config->setDefaultDB('ชื่อฐานข้อมูลที่ต้องการทำงานด้วย เช่น test');
$config->setMetadataDriverImpl(AnnotationDriver::create(__DIR__ . '/Application/Model/Mongo/Documents'));
$dm = DocumentManager::create($m, $config);
$employee = new Employee();
$employee->setName('Employee');
$employee->setSalary(50000);
$employee->setStarted(new DateTime());
$address = new Address();
$address->setAddress('555 Doctrine Rd.');
$address->setCity('Nashville');
$address->setState('TN');
$address->setZipcode('37209');
$employee->setAddress($address);
$project = new Project('New Project');
$manager = new Manager();
$manager->setName('Manager');
$manager->setSalary(100000);
$manager->setStarted(new DateTime());
$manager->addProject($project);
$dm->persist($employee);
$dm->persist($address);
$dm->persist($project);
$dm->persist($manager);
$dm->flush();
//ทดสอบดึงค่าออกมาแสดง
$managerArr = $dm->createQueryBuilder(Manager::class)
->hydrate(false) // ->hydrate(false) เพื่อดึงเป็น array แทน ODM Object
->limit(20)
->getQuery()
->execute();
foreach ($managerArr as $document) {
echo $document["name"] . "<br />\n";
}
} catch (MongoConnectionException $e) {
echo 'Couldn\'t connect to mongodb, is the "mongo" process running?';
exit();
}
อ้างอิง : https://www.doctrine-project.org/projects/doctrine-mongodb-odm/en/2.3/reference/query-builder-api.html#query-builder-api
.
ชลิตา จูมสีมา : เขียน/เรียบเรียง
.
..
ความคิดเห็น
แสดงความคิดเห็น