2017-09-01 83 views
0

我做的AdvertPlatform與Symfony的2.5和PHP 5.3。Symfony2的一對多關係

我想添加一項功能:當用戶看到(通過點擊它)廣告時,我們可以看到一條文字"Seen by : {{username}}"

我開始用的關係添加nammed AdvertReader一個新的實體一對多AdvertAdvertReader之間:

Advert.php:

/** 
    * Advert 
    * 
    * @ORM\Table() 
    * @ORM\Entity(repositoryClass="Society\PerfclientBundle\Entity\AdvertRepository") 
    * @ORM\HasLifecycleCallbacks() 
    * @UniqueEntity(fields="title", message="Une annonce existe déjà avec ce titre.") 
    */   
    class Advert 
    { 
     public function __construct() 
     { 
      $this->date = new \Datetime(); 
     } 

    /** 
    * 
    * @ORM\OneToMany(targetEntity="Society\PerfclientBundle\Entity\AdvertReader", mappedBy="advert", cascade={"persist"}) 
    */ 
    private $readers; 


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

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date", type="datetime") 
    */ 
    private $date; 

    /** 
* @var string 
* 
* @ORM\Column(name="title", type="string", length=255, unique=true) 
* 
* @Assert\Length(min=10, minMessage="Le titre de l'annonce doit faire au moins {{ limit }} caractères.") 
*/ 
    private $title; 

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

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

    /** 
    * @var string 
    * 
    * @ORM\Column(name="content", type="text") 
    * @Assert\Length(min=10, minMessage="Le contenu de l'annonce doit faire au moins {{ limit }} caractères.") 
    */ 
    private $content; 

    /** 
    * @ORM\Column(name="updated_at", type="datetime", nullable=true) 
    */ 
    private $updatedAt;` 

AdvertReader.php:

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

    /** 
    * @ORM\ManyToOne(targetEntity="Society\PerfclientBundle\Entity\Advert", inversedBy="readers") 
    * @ORM\JoinColumn(name="advert_id", referencedColumnName="id") 
    */ 
    private $advert; 

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

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created_at", type="datetime") 
    */ 
    private $createdAt; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="updated_at", type="datetime") 
    */ 
    private $updatedAt; 


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

    /** 
    * Set advert 
    * 
    * @param integer $advert 
    * @return AdvertReader 
    */ 
    public function setAdvert($advert) 
    { 
     $this->advert = $advert; 

     return $this; 
    } 

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

    /** 
    * Set username 
    * 
    * @param string $username 
    * @return AdvertReader 
    */ 
    public function setUsername($username) 
    { 
     $this->username = $username; 

     return $this; 
    } 

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

而我的viewAction ()

/** 
    * @param $id 
    * @return Response 
    */ 
    public function viewAction($id) 
    { 
     // On récupère le repository 
     $repository = $this->getDoctrine() 
      ->getManager() 
      ->getRepository('SocietyPerfclientBundle:Advert') 
     ; 
     $advert = $repository->find($id); 

     if (null === $advert) { 
      throw new NotFoundHttpException("L'annonce d'id ".$id." n'existe pas."); 
     } 

     $securityContext = $this->container->get('security.context'); 
     $user = $securityContext->getToken()->getUser(); 

     if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) { 
      $em = $this->getDoctrine()->getManager(); 
      $queryBuilder = $em->createQueryBuilder(); 

      $query = $queryBuilder->select('count(ar.id)') 
       ->from('SocietyPerfclientBundle:AdvertReader', 'ar') 
       ->where('ar.advert = :advert') 
       ->andWhere('ar.username = :username') 
       ->setParameter('advert', $advert->getId()) 
       ->setParameter('username', $user->getUsername()) 
       ->getQuery(); 

      $advertReaderCount = $query->getSingleScalarResult(); 

      if ($advertReaderCount <= 0) { 
// l'utilisateur lis pour la 1er fois 
       $advertReader = new AdvertReader; 
       $advertReader->setAdvert($advert->getId()); 
       $advertReader->setUpdatedAt(new \DateTime); 
       $advertReader->setUsername($user->getUsername()); 
       $advertReader->setCreatedAt(new \DateTime); 

       $em->persist($advertReader); 
       $em->flush(); 
      } 
     } 

     return $this->render('SocietyPerfclientBundle:Default:view.html.twig', array(
      'advert' => $advert, 
     )); 
    } 

教義:模式:驗證 - > [映射] OK [數據庫] OK

Error500 ORM例外:在關聯社會\ PerfclientBundle \實體\ AdvertReader#廣告類型的實測值的實體,但期待學會\ PerfclientBundle \ Entity \ Advert

Stack Trace Profiler: UnitOfWork - > computeAssociationChanges(array('fieldName'=>'advert','joinColumns'=> array(array('name'=>'advert_id','unique' =>假, '可爲空'=>真, 'onDelete'=>空值, 'columnDefinition'=>空值, 'referencedColumnName'=>的 'id')), '級聯'=>數組(), 'inversedBy'=> '讀者','targetEntity'=>'Soc iety \ PerfclientBundle \實體\廣告 ' '取'=> '2', '類型'=> '2', '的mappedBy'=>空值, 'isOwningSide'=>真, 'sourceEntity'=>' 學會\ PerfclientBundle \實體\ AdvertReader ' 'isCascadeRemove'=>假, 'isCascadePersist'=>假, 'isCascadeRefresh'=>假, 'isCascadeMerge'=>假, 'isCascadeDetach'=>假, 'sourceToTargetKeyColumns'=>數組(' advert_id '=>的 'id'), 'joinColumnFieldNames'=>數組(' advert_id」 => 'advert_id'), 'targetToSourceKeyColumns'=>陣列( 'ID'=> 'advert_id'), 'orphanRemoval'=>假), '26')

這有什麼錯我的實體關係? 請幫我:)

+0

如果可能,請嘗試移動到新版本。這並不難,也非常有益。 – svgrafov

回答

2

我認爲問題來源於此代碼的代碼

$advertReader->setAdvert($advert->getId()); 

試試這個:

$advertReader->setAdvert($advert); 

主義是對關係期待的對象,而是你傳遞一些整數。

希望這會有所幫助。快樂編碼

Alexandru Cosoi