2016-12-24 32 views
1

私はDoctrineに新しく、Slim FrameworkとDoctrineを組み合わせようとしています。 単純なクエリでDoctrine with Slimを使用できます。しかし、私はDoctrineで複雑なクエリを作成する方法を知らない。内部結合Doctrine

私は2つのエンティティ、1つのケースと1つのケースの翻訳を持っています。 次に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; 
    } 
} 
+0

問題の外部キーが明確ではありません。 –

+1

@ViníciusFagundesの外部キーはcidです。 – Ozgun

答えて

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です。それは1つのレジスタだけを表します。