内在联系主义

时间:2016-12-24 19:50:10

标签: php mysql doctrine-orm

我是Doctrine的新手,我正在尝试将Slim Framework与Doctrine结合起来。 我可以使用Slim的Doctrine和简单的查询。但我不知道如何在Doctrine中创建复杂的查询。

我有两个实体,一个案例和一个案例翻译。 然后我有CasesResource和CasesService。我想将内部联接添加到CasesService中。我怎么能这样做?

Cases.php(实体)

<?php

namespace App\Entity;

use App\Entity;
use Doctrine\ORM\Mapping;

/**
 * Class Cases
 * @package App\Entity
 * Table(name="cases")
 */
class Cases {
    /**
     * @Column(type="integer")
     * @var integer
     */
    protected $uid;

    /**
     * @Column(type="string", length=10)
     * @var string
     */
    protected $shipment_id;

    /**
     * @Column(type="string", length=50)
     * @var string
     */
    protected $name;

    /**
     * @Column(type="string", length=50)
     * @var string
     */
    protected $thumbnail_path;

    /**
     * @Column(type="integer")
     * @var integer
     */
    protected $scan_state;

    /**
     * @Column(type="integer")
     * @var integer
     */
    protected $type;

    /**
     * @Column(type="integer")
     * @var integer
     */
    protected $archive;

    /**
     * @return int
     */
    public function getUid() {
        return $this->uid;
    }

    /**
     * @param int $uid
     */
    public function setUid($uid) {
        $this->uid = $uid;
    }

    /**
     * @return string
     */
    public function getShipmentId() {
        return $this->shipment_id;
    }

    /**
     * @param string $shipment_id
     */
    public function setShipmentId($shipment_id) {
        $this->shipment_id = $shipment_id;
    }

    /**
     * @return string
     */
    public function getName() {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName($name) {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getThumbnailPath() {
        return $this->thumbnail_path;
    }

    /**
     * @param string $thumbnail_path
     */
    public function setThumbnailPath($thumbnail_path) {
        $this->thumbnail_path = $thumbnail_path;
    }

    /**
     * @return int
     */
    public function getScanState() {
        return $this->scan_state;
    }

    /**
     * @param int $scan_state
     */
    public function setScanState($scan_state) {
        $this->scan_state = $scan_state;
    }

    /**
     * @return int
     */
    public function getType() {
        return $this->type;
    }

    /**
     * @param int $type
     */
    public function setType($type) {
        $this->type = $type;
    }

    /**
     * @return int
     */
    public function getArchive() {
        return $this->archive;
    }

    /**
     * @param int $archive
     */
    public function setArchive($archive) {
        $this->archive = $archive;
    }
}

CasesTranslation.php(实体)

<?php

namespace App\Entity;

use App\Entity;
use Doctrine\ORM\Mapping;

/**
 * Class CasesTranslation
 * @package App\Entity
 * @Table(name="cases_translation")
 */
class CasesTranslation {

    /**
     * @Column(type="integer")
     * @var integer
     */
    protected $cid;

    /**
     * @Column(type="integer")
     * @var integer
     */
    protected $age;

    /**
     * @Column(type="string")
     * @var string
     */
    protected $gender;

    /**
     * @Column(type="string")
     * @var string
     */
    protected $lesion_placement;

    /**
     * @Column(type="string")
     * @var string
     */
    protected $extra_information;

    /**
     * @return mixed
     */
    public function getCid() {
        return $this->cid;
    }

    /**
     * @param mixed $cid
     */
    public function setCid($cid) {
        $this->cid = $cid;
    }

    /**
     * @return mixed
     */
    public function getAge() {
        return $this->age;
    }

    /**
     * @param mixed $age
     */
    public function setAge($age) {
        $this->age = $age;
    }

    /**
     * @return mixed
     */
    public function getGender() {
        return $this->gender;
    }

    /**
     * @param mixed $gender
     */
    public function setGender($gender) {
        $this->gender = $gender;
    }

    /**
     * @return mixed
     */
    public function getLesionPlacement() {
        return $this->lesion_placement;
    }

    /**
     * @param mixed $lesion_placement
     */
    public function setLesionPlacement($lesion_placement) {
        $this->lesion_placement = $lesion_placement;
    }

    /**
     * @return mixed
     */
    public function getExtraInformation() {
        return $this->extra_information;
    }

    /**
     * @param mixed $extra_information
     */
    public function setExtraInformation($extra_information) {
        $this->extra_information = $extra_information;
    }
}

Cases.php(资源)

<?php

namespace App\Resource;

use App\Resource;
use App\Service\Cases as CasesService;

/**
 * Class Cases
 * @package App\Resource
 */
class Cases extends Resource {

    /**
     * @var \App\Service\Cases
     */
    private $casesService;

    /**
     * Get cases service
     */
    public function init() {
        $this->setCasesService(new CasesService($this->getEntityManager()));
    }

    /**
     * @param null $id
     */
    public function get($id = null) {
        if ($id == null)
            $data = $this->casesService->getCases();
        else
            $data = $this->casesService->getCase($id);

        if ($data == null) {
            self::response(self::STATUS_BAD_REQUEST);
            return;
        }

        $response = array('cases' => $data);
        self::response(self::STATUS_OK, $response);
    }

    /**
     * Create case
     */
    public function post() {
        $uid = $this->getSlim()->request()->params('uid');
        $shipment_id = $this->getSlim()->request()->params('shipment_id');
        $name = $this->getSlim()->request()->params('name');
        $thumbnail_path = $this->getSlim()->request()->params('thumbnail_path');
        $type = $this->getSlim()->request()->params('type');

        if (empty($uid) || empty($name) || empty($thumbnail_path) || empty($type)) {
            self::response(self::STATUS_BAD_REQUEST);
            return;
        }

        $case = $this->getCasesService()->createCase($uid, $shipment_id, $name, $thumbnail_path, $type);

        self::response(self::STATUS_CREATED, array('case', $case));
    }

    /**
     * Update case
     *
     * @param null $id
     */
    public function put($id = null){
        $uid = $this->getSlim()->request()->params('uid');
        $shipment_id = $this->getSlim()->request()->params('shipment_id');
        $name = $this->getSlim()->request()->params('name');
        $thumbnail_path = $this->getSlim()->request()->params('thumbnail_path');
        $scan_state = $this->getSlim()->request()->params('scan_state');
        $type = $this->getSlim()->request()->params('type');
        $archive = $this->getSlim()->request()->params('archive');

        if (empty($uid) || empty($name) || empty($thumbnail_path) || empty($scan_state) || empty($type) || empty($archive)) {
            self::response(self::STATUS_BAD_REQUEST);
            return;
        }

        $case = $this->getCasesService()->updateCase($id, $uid, $shipment_id, $name, $thumbnail_path, $scan_state, $type, $archive);

        if ($case === null) {
            self::response(self::STATUS_NOT_IMPLEMENTED);
            return;
        }

        self::response(self::STATUS_NO_CONTENT);
    }

    /**
     * Delete case
     *
     * @param null $id
     */
    public function delete($id = null) {
        $status = $this->getCasesService()->deleteCase($id);

        if ($status === null) {
            self::response(self::STATUS_NOT_FOUND);
            return;
        }

        self::response(self::STATUS_OK);
    }

    /**
     * Show options in header
     */
    public function options() {
        self::response(self::STATUS_OK, array(), array('GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'));
    }

    /**
     * @return \App\Service\Cases
     */
    public function getCasesService() {
        return $this->casesService;
    }

    /**
     * @param \App\Service\Cases $casesService
     */
    public function setCasesService($casesService) {
        $this->casesService = $casesService;
    }

    /**
     * @return array
     */
    public function getOptions() {
        return $this->options;
    }
}

Cases.php(服务)

<?php

namespace App\Service;

use App\Service;
use App\Entity\Cases as CasesEntity;

/**
 * Class Cases
 * @package App\Service
 */
class Cases extends Service {

    /**
     * @return array|null
     */
    public function getCases() {
        $repository = $this->getEntityManager()->getRepository('App\Entity\Cases');
        $cases = $repository->findAll();

        if ($cases == null)
            return null;

        /**
         * @var \App\Entity\Cases $case
         */
        $data = array();
        foreach ($cases as $case) {
            $data[] = array (
                'id' => $case->getId(),
                'uid' => $case->getUid(),
                'shipment_id' => $case->getShipmentId(),
                'name' => $case->getName(),
                'thumbnail_path' => $case->getThumbnailPath(),
                'scan_state' => $case->getScanState(),
                'type' => $case->getType(),
                'archive' => $case->getArchive(),
                'created_at' => $case->getCreatedAt(),
                'updated_at' => $case->getUpdatedAt(),
                'is_deleted' => $case->getIsDeleted()
            );
        }
        return $data;
    }

    /**
     * @param $id
     * @return array|null
     */
    public function getCase($id) {
        $repository = $this->getEntityManager()->getRepository('App\Entity\Cases');
        $cases = $repository->find($id);

        if ($cases == null)
            return null;

        return array (
            'id' => $cases->getId(),
            'uid' => $cases->getUid(),
            'shipment_id' => $cases->getShipmentId(),
            'name' => $cases->getName(),
            'thumbnail_path' => $cases->getThumbnailPath(),
            'scan_state' => $cases->getScanState(),
            'type' => $cases->getType(),
            'archive' => $cases->getArchive(),
            'created_at' => $cases->getCreatedAt(),
            'updated_at' => $cases->getUpdatedAt(),
            'is_deleted' => $cases->getIsDeleted()
        );
    }

    /**
     * @param $uid
     * @param $shipment_id
     * @param $name
     * @param $thumbnail_path
     * @param $scan_state
     * @param $type
     * @return array
     */
    public function createCase($uid, $shipment_id, $name, $thumbnail_path, $type) {
        $case = new CasesEntity();
        $case->setUid($uid);
        $case->setShipmentId($shipment_id);
        $case->setName($name);
        $case->setThumbnailPath($thumbnail_path);
        $case->setType($type);

        $this->getEntityManager()->persist($case);
        $this->getEntityManager()->flush();

        return array (
            'id' => $case->getId(),
            'uid' => $case->getUid(),
            'shipment_id' => $case->getShipmentId(),
            'name' => $case->getName(),
            'thumbnail_path' => $case->getThumbnailPath(),
            'scan_state' => $case->getScanState(),
            'type' => $case->getType(),
            'archive' => $case->getArchive(),
            'created_at' => $case->getCreatedAt(),
            'updated_at' => $case->getUpdatedAt(),
            'is_deleted' => $case->getIsDeleted()
        );
    }

    /**
     * @param $id
     * @param $uid
     * @param $shipment_id
     * @param $name
     * @param $thumbnail_path
     * @param $scan_state
     * @param $type
     * @return array|null
     */
    public function updateCase($id, $uid, $shipment_id, $name, $thumbnail_path, $scan_state, $type, $archive) {

        /**
         * @var \App\Entity\Cases $case
         */
        $repository = $this->getEntityManager()->getRepository('App\Entity\Cases');
        $case = $repository->find($id);

        if ($case == null)
            return null;

        $case->setUid($uid);
        $case->setShipmentId($shipment_id);
        $case->setName($name);
        $case->setThumbnailPath($thumbnail_path);
        $case->setScanState($scan_state);
        $case->setType($type);
        $case->setArchive($archive);

        $this->getEntityManager()->persist($case);
        $this->getEntityManager()->flush();

        return array (
            'id' => $case->getId(),
            'uid' => $case->getUid(),
            'shipment_id' => $case->getShipmentId(),
            'name' => $case->getName(),
            'thumbnail_path' => $case->getThumbnailPath(),
            'scan_state' => $case->getScanState(),
            'type' => $case->getType(),
            'archive' => $case->getArchive(),
            'created_at' => $case->getCreatedAt(),
            'updated_at' => $case->getUpdatedAt(),
            'is_deleted' => $case->getIsDeleted()
        );
    }

    /**
     * @param $id
     * @return bool|null
     */
    public function deleteCase($id) {
        /**
         * @var \App\Entity\Cases $case
         */
        $repository = $this->getEntityManager()->getRepository('App\Entity\Cases');
        $case = $repository->find($id);

        if ($case == null)
            return null;

        $this->getEntityManager()->remove($case);
        $this->getEntityManager()->flush();

        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

在加入之前,您应该映射您的实体关系。您可以考虑阅读Association Mapping in Doctrine Documentation

 class CasesTranslation {

       /**
        * One CasesTranslation has One Cases. Mapped here.
        * @OneToOne(targetEntity="Cases")
        * @JoinColumn(name="cid", referencedColumnName="id",inversedBy="caseTranslation")
        */
       protected $case;

       // getter and setter here
 }

 class CasesTranslation {
      /**
        * One Cases has One CasesTranslation. Inversed here.
        * @OneToOne(targetEntity="CasesTranslation",mappedBy="case")
        */
       protected $caseTranslation;

       // getter and setter here
 }

回到你的服务中,你可以简单地从任何CasesTranslation调用案例:

$caseTranslation->getCases(); // return one case

<强> PS

这是一个常见的pratice创建实体名称的单数。它只代表一个寄存器。