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
.

ชลิตา จูมสีมา : เขียน/เรียบเรียง

.



..

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

CASIO fx-5800P : การ mod ด้วยเครื่องคิดเลข

sgsBB(SGS-Score Inserter) : โปรแกรมช่วยกรอกผลคะแนนจาก bookmark51 ใส่ระบบ SGS ของ สพฐ.

springMVC : เชื่อมต่อฐานข้อมูล mySQL ด้วย JDBC-Template