簡體   English   中英

Symfony FOS Rest Bundle Api稱為多對多關系

[英]Symfony FOS Rest Bundle Api Call Many to Many Relationship

我似乎有問題。 而且我相信它的修復非常簡單。 我有一個使用FOS Rest捆綁包的API。 我有一個電話,它將POST請求發送到postCreateTimesheetAction(Request $ request),此請求在時間表表中創建了一個空行。 我還有另一個調用patchTimesheetAction,稍后將一些數據添加到表中。 好的,一切都很好。 我還有另一個調用patchCareoptionAction(Timesheet $ timesheet),它在表中創建一行,該表具有從CareOptions.php(下)和Timesheet.php(下)構建的多對多關系。 所有的api調用都能正常工作並發揮應有的作用。 我將在下面發布它們:

在時間表表中創建一個空白的新時間表行:(Timesheet.php)

curl -H“接受:應用程序/ json” -H“內容類型:應用程序/ json” -i -X POST -d'{“ homecare_homecarebundle_timesheet”:“”}'www.hc-timesheets-demo.com/app_dev。 php / api / v1 / create / timesheet

使用數據更新時間表行:

curl -i -H“接受:應用程序/ json” -H“內容類型:應用程序/ json” -d'{“ homecare_homecarebundle_timesheet”:{“ agency”:“ 157”,“收件人”:“ 154”,“ pca “:” 16“,”服務“:” 6“}}'-X PATCH www.hc-timesheets-demo.com/app_dev.php/api/v1/timesheet/31

最后創建多對多關系:

curl -i -H“接受:應用程序/ json” -H“內容類型:應用程序/ json” -d'{“ homecare_homecarebundle_timesheet”:{“ careOption”:[456,457]}}'-X PATCH www.hc-timesheets -demo.com/app_dev.php/api/v1/careoption/31

請注意補丁請求末尾的31。 這是從第一個api調用在表中創建的時間表的ID。 因此,讓我開始提問吧! 每當我調用第三次api調用時,我都會在表中成功創建多對多行。 但是,當我再次調用它時,它不會用新行替換舊行。 它只會向表中添加更多行。 我希望更新許多表行而舊表行消失。 我需要先刪除它們嗎? 讓我解釋一下。 如果您在第3個api調用中看到,我將向時間表添加2個careOptions:(careOptions 456和457)。 好吧,如果我再次調用它,並說我想添加458和459。我希望456和457自動刪除並消失。 請有人幫我嗎??

這是多對多關系的歸屬面

<?php
//src/Homecare/HomecareBundle/Entity/CareOptions.php
namespace Homecare\HomecareBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * CareGoals
 *
 * @ORM\Table(name="careoptions")
 * @ORM\Entity(repositoryClass="Homecare\HomecareBundle\Entity\Repository\CareOptionsRepository")
 */
class CareOptions
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\OneToMany(targetEntity="CareOptionsTimesheets", mappedBy="careOption")
     */
        private $care_options_timesheets;


/**
 * @var string
 *
 * @ORM\Column(name="care_option", type="string", length=255)
 */
    private $careOption;


    /**
    * @ORM\ManyToMany(targetEntity="CareGoals", mappedBy="careOption")
    */
    private $careGoals;





    /**
    * @ORM\ManyToMany(targetEntity="Timesheet", inversedBy="careOption", cascade={"persist"})
    */
    private $timesheet;




    public function __construct()
     {
         $this->care_options_timesheets = new ArrayCollection();

                 $this->timesheet = new ArrayCollection();

     }



/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}







    //add a to string method so that the object can be displayed in the twig template
    /*
    public function __toString()
            {
                return $this->getCareGoal();
            }
    */


/**
 * Set careOption
 *
 * @param string $careOption
 * @return CareOptions
 */
public function setCareOption($careOption)
{
    $this->careOption = $careOption;

    return $this;
}

/**
 * Get careOption
 *
 * @return string 
 */
public function getCareOption()
{
    return $this->careOption;
}

/**
 * Add care_options_timesheets
 *
 * @param \Homecare\HomecareBundle\Entity\CareOptions_Timesheets $careOptionsTimesheets
 * @return CareOptions
 */
public function addCareOptionsTimesheet(\Homecare\HomecareBundle\Entity\CareOptionsTimesheets $careOptionsTimesheets)
{
    $this->care_options_timesheets[] = $careOptionsTimesheets;

    return $this;
}

/**
 * Remove care_options_timesheets
 *
 * @param \Homecare\HomecareBundle\Entity\CareOptions_Timesheets $careOptionsTimesheets
 */
public function removeCareOptionsTimesheet(\Homecare\HomecareBundle\Entity\CareOptionsTimesheets $careOptionsTimesheets)
{
    $this->care_options_timesheets->removeElement($careOptionsTimesheets);
}

/**
 * Get care_options_timesheets
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getCareOptionsTimesheets()
{
    return $this->care_options_timesheets;
}

/**
 * Add careGoals
 *
 * @param \Homecare\HomecareBundle\Entity\CareGoals $careGoals
 * @return CareOptions
 */
public function addCareGoal(\Homecare\HomecareBundle\Entity\CareGoals $careGoals)
{
    $this->careGoals[] = $careGoals;

    return $this;
}

/**
 * Remove careGoals
 *
 * @param \Homecare\HomecareBundle\Entity\CareGoals $careGoals
 */
public function removeCareGoal(\Homecare\HomecareBundle\Entity\CareGoals $careGoals)
{
    $this->careGoals->removeElement($careGoals);
}

/**
 * Get careGoals
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getCareGoals()
{
    return $this->careGoals;
}



    public function __toString() {
        return $this->getCareOption();
    }



/**
 * Add timesheet
 *
 * @param \Homecare\HomecareBundle\Entity\Timesheet $timesheet
 * @return CareOptions
 */
public function addTimesheet(\Homecare\HomecareBundle\Entity\Timesheet $timesheet)
{
    $this->timesheet[] = $timesheet;

    return $this;
}

/**
 * Remove timesheet
 *
 * @param \Homecare\HomecareBundle\Entity\Timesheet $timesheet
 */
public function removeTimesheet(\Homecare\HomecareBundle\Entity\Timesheet $timesheet)
{
    $this->timesheet->removeElement($timesheet);
}

/**
 * Get timesheet
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getTimesheet()
{
    return $this->timesheet;
}
}

這是多對多關系的另一面:

<?php
//src/Homecare/HomecareBundle/Entity/Timesheet.php
namespace Homecare\HomecareBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Type;
use JMS\Serializer\Annotation\SerializedName;

/**
 * Timesheet
 *
 * @ORM\Table(name="timesheet")
 * @ORM\Entity(repositoryClass="Homecare\HomecareBundle\Entity\Repository\TimesheetRepository")
 */
class Timesheet
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
     * @Type("integer")
     * @SerializedName("id")
 */
private $id;



/**
 * @ORM\ManyToOne(targetEntity="Agency", inversedBy="actualTimesheets")
     * @ORM\JoinColumn(name="agency_id", referencedColumnName="id")
     * @Type("Homecare\HomecareBundle\Entity\Agency")
     * @SerializedName("agency")
 */
private $agency;



/**
 * @ORM\ManyToOne(targetEntity="Recipient", inversedBy="actualTimesheets")
     * @ORM\JoinColumn(name="recipient_id", referencedColumnName="id")
     * @Type("Homecare\HomecareBundle\Entity\Recipient")
     * @SerializedName("recipient")
 */
private $recipient;


/**
 * @ORM\ManyToOne(targetEntity="Pca", inversedBy="actualTimesheets")
     * @ORM\JoinColumn(name="pca_id", referencedColumnName="id")
     * @Type("Homecare\HomecareBundle\Entity\Pca")
     * @SerializedName("pca")
 */
private $pca;


/**
 * @ORM\ManyToOne(targetEntity="Services", inversedBy="actualTimesheets")
     * @ORM\JoinColumn(name="service_id", referencedColumnName="id")
     * @Type("Homecare\HomecareBundle\Entity\Services")
     * @SerializedName("service")
 */
private $service;





    /**
    * @ORM\Column(name="continueTimesheetNumber",type="integer",nullable=true)
    * @Type("integer")
    * @SerializedName("continueTimesheetNumber")
    */
    private $continueTimesheetNumber;





    /**
    * @ORM\ManyToOne(targetEntity="VisitRatios", inversedBy="timesheets")
    * @Type("Homecare\HomecareBundle\Entity\VisitRatios")
    * @SerializedName("visitRatio")
    */
    private $visitRatio;





/**
 * @ORM\ManyToOne(targetEntity="TimeIn", inversedBy="timesheets")
     * @Type("Homecare\HomecareBundle\Entity\TimeIn")
     * @SerializedName("timeIn")
 */
private $timeIn;




/**
 * @ORM\ManyToOne(targetEntity="TimeOut", inversedBy="timesheets")
     * @Type("Homecare\HomecareBundle\Entity\TimeOut")
     * @SerializedName("timeOut")
 */
private $timeOut;





/**
 * @ORM\ManyToOne(targetEntity="Files", inversedBy="timesheets")
     * @Type("Homecare\HomecareBundle\Entity\Files")
     * @SerializedName("file")
 */
private $file;



    /**
    * @ORM\ManyToMany(targetEntity="CareOptions", mappedBy="timesheet", cascade={"persist"})
    * @Type("Homecare\HomecareBundle\Entity\CareOptions")
    * @SerializedName("careOption")
    */
    private $careOption;




/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}




/**
 * Set agency
 *
 * @param \Homecare\HomecareBundle\Entity\Agency $agency
 * @return Timesheet
 */
public function setAgency(\Homecare\HomecareBundle\Entity\Agency $agency = null)
{
    $this->agency = $agency;

    return $this;
}

/**
 * Get agency
 *
 * @return \Homecare\HomecareBundle\Entity\Agency 
 */
public function getAgency()
{
    return $this->agency;
}

/**
 * Set recipient
 *
 * @param \Homecare\HomecareBundle\Entity\Recipient $recipient
 * @return Timesheet
 */
public function setRecipient(\Homecare\HomecareBundle\Entity\Recipient $recipient = null)
{
    $this->recipient = $recipient;

    return $this;
}

/**
 * Get recipient
 *
 * @return \Homecare\HomecareBundle\Entity\Recipient 
 */
public function getRecipient()
{
    return $this->recipient;
}

/**
 * Set pca
 *
 * @param \Homecare\HomecareBundle\Entity\Pca $pca
 * @return Timesheet
 */
public function setPca(\Homecare\HomecareBundle\Entity\Pca $pca = null)
{
    $this->pca = $pca;

    return $this;
}

/**
 * Get pca
 *
 * @return \Homecare\HomecareBundle\Entity\Pca 
 */
public function getPca()
{
    return $this->pca;
}

/**
 * Set service
 *
 * @param \Homecare\HomecareBundle\Entity\Services $service
 * @return Timesheet
 */
public function setService(\Homecare\HomecareBundle\Entity\Services $service = null)
{
    $this->service = $service;

    return $this;
}

/**
 * Get service
 *
 * @return \Homecare\HomecareBundle\Entity\Services 
 */
public function getService()
{
    return $this->service;
}




/**
 * Set continueTimesheetNumber
 *
 * @param integer $continueTimesheetNumber
 * @return Timesheet
 */
public function setContinueTimesheetNumber($continueTimesheetNumber)
{
    $this->continueTimesheetNumber = $continueTimesheetNumber;

    return $this;
}

/**
 * Get continueTimesheetNumber
 *
 * @return integer 
 */
public function getContinueTimesheetNumber()
{
    return $this->continueTimesheetNumber;
}

/**
 * Set visitRatio
 *
 * @param \Homecare\HomecareBundle\Entity\VisitRatios $visitRatio
 * @return Timesheet
 */
public function setVisitRatio(\Homecare\HomecareBundle\Entity\VisitRatios $visitRatio = null)
{
    $this->visitRatio = $visitRatio;

    return $this;
}

/**
 * Get visitRatio
 *
 * @return \Homecare\HomecareBundle\Entity\VisitRatios 
 */
public function getVisitRatio()
{
    return $this->visitRatio;
}

/**
 * Set timeIn
 *
 * @param \Homecare\HomecareBundle\Entity\TimeIn $timeIn
 * @return Timesheet
 */
public function setTimeIn(\Homecare\HomecareBundle\Entity\TimeIn $timeIn = null)
{
    $this->timeIn = $timeIn;

    return $this;
}

/**
 * Get timeIn
 *
 * @return \Homecare\HomecareBundle\Entity\TimeIn 
 */
public function getTimeIn()
{
    return $this->timeIn;
}

/**
 * Set timeOut
 *
 * @param \Homecare\HomecareBundle\Entity\TimeOut $timeOut
 * @return Timesheet
 */
public function setTimeOut(\Homecare\HomecareBundle\Entity\TimeOut $timeOut = null)
{
    $this->timeOut = $timeOut;

    return $this;
}

/**
 * Get timeOut
 *
 * @return \Homecare\HomecareBundle\Entity\TimeOut 
 */
public function getTimeOut()
{
    return $this->timeOut;
}

/**
 * Set file
 *
 * @param \Homecare\HomecareBundle\Entity\Files $file
 * @return Timesheet
 */
public function setFile(\Homecare\HomecareBundle\Entity\Files $file = null)
{
    $this->file = $file;

    return $this;
}

/**
 * Get file
 *
 * @return \Homecare\HomecareBundle\Entity\Files 
 */
public function getFile()
{
    return $this->file;
}
/**
 * Constructor
 */
public function __construct()
{
    $this->careOption = new \Doctrine\Common\Collections\ArrayCollection();
}




/**
 * Add careOption
 *
 * @param \Homecare\HomecareBundle\Entity\CareOptions $careOption
 * @return Timesheet
 */
public function addCareOption(\Homecare\HomecareBundle\Entity\CareOptions $careOption)
{

          $careOption->addTimesheet( $this );

    $this->careOption[] = $careOption;

    return $this;
}

/**
 * Remove careOption
 *
 * @param \Homecare\HomecareBundle\Entity\CareOptions $careOption
 */
public function removeCareOption(\Homecare\HomecareBundle\Entity\CareOptions $careOption)
{
    $this->careOption->removeElement($careOption);
}

/**
 * Get careOption
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getCareOption()
{
    return $this->careOption;
}
}

這是formBuilder TimesheetType.php

<?php
//src/Homecare/HomecareBundle/Form/TimesheetType.php
namespace Homecare\HomecareBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

 class TimesheetType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('agency')
        ->add('recipient')
        ->add('pca')
        ->add('service')
                    ->add('continueTimesheetNumber')
                    ->add('visitRatio')
                    ->add('timeIn')
                    ->add('timeOut')
    ;

            $builder->add('careOption', 'entity', array(
                'class' => 'HomecareHomecareBundle:CareOptions',
                'property' => 'careOption',
                    'expanded' => true,
                    'multiple' => true,
                    'label' => false,
                    'by_reference' => false,

            ));

}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Homecare\HomecareBundle\Entity\Timesheet',
                    'csrf_protection'   => false,
    ));
}

/**
 * @return string
 */
public function getName()
{
    return 'homecare_homecarebundle_timesheet';
}
}

以下是ApiControllers:

<?php
//src/Homecare/HomecareApiBundle/Controller/TimesheetApiController.php
namespace Homecare\HomecareApiBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use FOS\RestBundle\Controller\Annotations\View;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Homecare\HomecareBundle\Entity\Timesheet;
use Homecare\HomecareBundle\Entity\Services;
use Homecare\HomecareBundle\Entity\CareOptions;
use Homecare\HomecareBundle\Form\TimesheetType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use JMS\Serializer\SerializerBuilder;
use FOS\RestBundle\View\View as V;
use Doctrine\Common\Collections\ArrayCollection;


class TimesheetApiController extends Controller
{




/**
* @View()
*/
public function patchCareoptionAction( Timesheet $timesheet )
{

    return $this->updateTimesheetForm( $timesheet );

    }









/**
* @View()
*/
public function postCreateTimesheetAction( Request $request )
{

        return $this->createTimesheetForm( $request, new Timesheet() );

    }









    /**
    * @View()
    */
    public function patchTimesheetAction( Timesheet $timesheet )
    {

        return $this->updateTimesheetForm( $timesheet );

        }







        private function setMethod( $statusCode, $timesheet = null ){

           switch( $statusCode ) {

                case 201:
                return array( 'method' => 'POST' );
                break;

                case 204:
                return array( 
                    'action' => $this->generateUrl('patch_timesheet', array('timesheet' => $timesheet->getId())),
                    'method' => 'PATCH' 
                );
                break;

            }

        }







            /**
            * @View()
            */
            private function updateTimesheetForm( Timesheet $timesheet)
                {



                    $statusCode = 204;

                    $form = $this->createForm(new TimesheetType(), $timesheet, $this->setMethod( $statusCode, $timesheet ) );



                         $form->handleRequest( $this->getRequest() );


                    if ($form->isValid()) {


                                $em = $this->getDoctrine()->getManager();


                                //$careOption = $em->getRepository( "HomecareHomecareBundle:CareOptions" )->findOneById(456);


                                //$timesheet->addCareOption( $careOption );

                                $em->persist( $timesheet );
                    $em->flush();

                        $response = new Response();
                        $response->setStatusCode( $statusCode );


                        return $response;
                    }

                    return V::create($form, 400);
                }









                    /**
                    * @View()
                    */
                  private function createTimesheetForm( $request, Timesheet $timesheet )
                     {


                              $statusCode = 201;

                                $form = $this->createForm( new TimesheetType(), $timesheet, $this->setMethod( $statusCode ) );


                         $form->handleRequest( $this->getRequest() );

                         if ( $form->isValid() ) {
                             //$user->save();

                                         //$timesheet = $form->getData();

                             $response = new Response();
                             $response->setStatusCode(201);


                                        $em = $this->getDoctrine()->getManager();
                                        $em->persist( $timesheet );
                            $em->flush();




                       //return V::create($form, 201);
                             //return $response;

                             //return array( $form, array("timesheet" => array("id" => $timesheet->getId() ) ) );



     return V::create( array("createdTimesheet" => array("id" => $timesheet->getId() ) ), $statusCode );


                                        // return array( $form, array("timesheet" => array("id" => $timesheet->getId() ) ) );

                         }

                         return V::create($form, 400);
                     }







}

您需要調用第二個API來刪除之前添加的2個選項,或者在updateTimesheet中刪除之前添加的2個選項,您可以通過在存儲庫中創建函數來通過查詢選擇它們:

public function getLastTwoCareOptions(){

$query = "SELECT co.id FROM CareOptionTable co INNER JOIN TimesheetTable ts WHERE ts.id = timesheetid ORDER BY co.id LIMIT 2;";

$connection = $this->getEntityManager()->getConnection();
$prep_query = $connection->prepare($req);
$result = $prep_query->fetchAll();
}

如果您可能需要在某天或更長時間內更新3個最后護理選項,則可以將限制作為函數的參數。

然后,您獲取ID,並將其從時間表中刪除。 另一種解決方案是使用相同的查詢以不同的方式通過SQL查詢刪除它們,而不必選擇然后刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM