2013-05-23 4 views
1

Symfony2를 사용하여 응용 프로그램을 만들려고하고 있습니다. 알아낼 수없는 것에 대비해 왔습니다. Company와 Entity라는 엔티티가 Many to Many 관계 (일대 다 많아야하지만 이것은 Symfony/Doctrine이 처리하는 방식이라고 생각합니다)라고합니다. 즉 각 회사는 하나 이상의 주소를 가질 수 있습니다. Gedmo의 Doctrine Extensions를 설정하고 두 엔티티에서 timestampable을 사용하고 있습니다. 연결된 엔티티를 모두 업데이트하는 양식을 설정했지만 주소가 업데이트되면 회사에 타임 스탬프를 지정할 수 있습니다. 둘의 소유자이므로 업데이트가 가능합니다.symfony2 timestampable 관련 엔티티 업데이트 포함

timestampable이 이것을 할 수 있는지 또는 내가 잘못했을 수도있는 사람이 누구인지 아시겠습니까?

<?php 
// src/Amber/AtsBundle/Entity/Company.php 
namespace Amber\AtsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 
//... 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Company 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Company 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToMany(targetEntity="Address", cascade={"persist"}) 
* @ORM\JoinTable(name="company_addresses", 
*  joinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id", unique=true)} 
*  ) 
**/ 
private $addresses; 

public function __construct() 
{ 
    $this->addresses = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

/** 
* @var datetime $created 
* 
* @Gedmo\Timestampable(on="create") 
* @ORM\Column(type="datetime") 
*/ 
private $created; 

/** 
* @var datetime $updated 
* 
* @Gedmo\Timestampable(on="update") 
* @ORM\Column(type="datetime") 
*/ 
private $updated; 

Address 클래스가 아닌 많은 당신이 세터와 게터를 볼 수 있지만 나를 수 있도록 필요가 있다고 생각하지 않습니다

<?php 
// src/Amber/AtsBundle/Entity/Address.php 
namespace Amber\AtsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* Address 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Address 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var datetime $created 
* 
* @Gedmo\Timestampable(on="create") 
* @ORM\Column(type="datetime") 
*/ 
private $created; 

/** 
* @var datetime $updated 
* 
* @Gedmo\Timestampable(on="update") 
* @ORM\Column(type="datetime") 
*/ 
private $updated; 

보고 :

현재 우리 회사의 클래스를 볼 수 있습니다 알고

컨트롤러

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class CompaniesController extends Controller 
{ 

    public function editAction(Request $request, $companyID) 
    { 
    $em = $this->getDoctrine()->getManager(); 
    $company = $em->getRepository('AmberAtsBundle:Company')->find($companyID); 

    $passExist = 'Yes'; 

    $form = $this->createForm(new CompanyType(), $company, array("pass_exists" => $passExist)); 

    if ($request->isMethod('POST')) { 
     $form->bind($request); 

     if ($form->isValid()) { 
      $em->flush(); 

      return $this->redirect($this->generateUrl('amber_ats_companies_edit', array('companyID' => $company->getId()))); 
     } 
    }  
} 

어떤 도움을 주셔서 감사합니다 ...

+0

명확하지 않은 점이 있으면 답변을 수락하십시오 : – nifr

+0

다른 팁 : @ParamConverter를 정리해주세요. 귀하의 컨트롤러 -> http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html – nifr

답변

1

관련 검색어의 변경 사항을 확인하지는 않습니다.

해결 방법은 회사가 소유하고있는 회사와 주소간에 양방향 일대 다 관계를 만드는 것입니다.

회사

/** 
* @ORM\OneToMany(targetEntity="Address", inversedBy="company", cascade={"persist"}) 
*/ 
protected $addresses; 

주소

/** 
* @ORM\ManyToOne(targetEntity="Company", mappedBy="adresses") 
*/ 
protected $company; 

public function getCompany() 
{ 
    return $this->company; 
} 

public function setCompany($company) 
{ 
    $this->company = $company; 

    return $this; 
} 

// now the the tricky part 

public function setUpdated($updated) 
{ 
    $this->updated = $updated; 

    if ($updated > $this->company->getUpdated()) 
    { 
     $this->company->setUpdated($updated); 
    } 

    return $this; 
} 
사용할 수

대다 여러 기업이이 같은 모든 관련 회사를 통해 동일한 주소와 루프를 가질 수있는 경우 :

public function setUpdated($updated) 
{ 
    $this->updated = $updated; 
    foreach ($this->companies as $company) { 
     if ($updated > $this->company->getUpdated()) 
     { 
      $this->company->setUpdated($updated); 
     } 
    } 

    return $this; 
} 

그에 따라 매핑 주석을 조정할 수 있지만 생각을하게 될 것입니다 ...

+0

감사합니다, 좋은 해결책입니다, 제 문제는 Person과 같은 다른 사람에게 서비스하기 위해 Address 엔티티를 사용할 계획이었습니다. . 그래서 나는 컨텍스트라면 주소를 업데이트하거나 Context라면 Person과 같은 다른 엔티티를 업데이트한다. –

+0

이 경우 비 지속 속성 (및 getter/setter) 컨텍스트를 다음에 추가한다. 귀하의 Address 엔티티를 설정하고 (__construct 또는 의존성 삽입으로) AddressFormType의 숨겨진 입력으로 설정하십시오. 다음과 같이 주소 엔티티에 setUpdated에 스위치를 포함하십시오. $ this -> {$ this-> context} = $ updated; ... 포함 된 컨텍스트를 사용하여 양식을 구성하는 경우 bindRequest는 주소에 'company'또는 'Person'컨텍스트가 있고 이것들 만 업데이트됩니다! 그러나 좀 더 자세한 정보를 원하면 내 대답과 구를 새로운 질문으로 받아주십시오. – nifr

+0

당신의 대답은 제게 생각이 떠올랐습니다.해결책은 컨트롤러에 코드를 추가하고 변경 사항을 플러시하고 날짜를 비교하고 필요한 경우 '업데이트 됨'을 업데이트 한 다음 변경 사항을 다시 플러시하는 것이 었습니다. 아래를보십시오 –

관련 문제