2016-12-24 4 views
1

Ich bin neu in Doctrine, ich versuche, Slim Framework mit Doctrine zu kombinieren. Ich kann Doctrine mit Slim mit einfachen Abfragen verwenden. Aber ich weiß nicht, wie man eine komplexe Abfrage in Doctrine erstellt.Innerer beitreten Doktrin

Ich habe zwei Entity, One Cases und One Cases Translation. Dann habe ich CasesResource und CasesService. Ich möchte einen inneren Join in den CasesService einfügen. Wie kann ich das machen ?

Cases.php (Entity)

<?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 (Entity)

<?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 (Resource)

<?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 (Service)

<?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

Es ist nicht klar, den Fremdschlüssel in Ihrem Problem. –

+1

@ ViníciusFagundes Fremdschlüssel ist CID – Ozgun

Antwort

1

Bevor trete ein Sie Ihre Entitäten Beziehung abbilden sollte. Sie können in Erwägung ziehen, Association Mapping in Doctrine Documentation zu lesen.

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 
} 

in dem Service Also zurück können Sie einfach Fälle von jeder CasesTranslation nennen:

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

PS

Es ist ein verbreitete pratice Entitätsname in Einzahl erstellen. Es stellt nur ein einzelnes Register dar.