2016-07-27 92 views
0

試圖設置兩個簡單對象PurchaseAddress一對多關鍵 - 未捕獲的PHP異常Symfony Component PropertyAccess Exception NoSuchPropertyException

一次購買可以有多個地址(購買地址,發票地址)

從地址實體

簡化ORM的樣子:

X\Entity\Address: 
    repositoryClass: X\Repository\AddressRepository 
    type: entity 
    manyToOne: 
     purchase: 
      targetEntity: Purchase 
      inversedBy: addresses 
      joinColumn: 
       name: purchase_id 
       referencedColumnName: id 
    id: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
    fields: 
     firstname: 
      type: string 
      length: 255 
     email: 
      type: string 
      length: 255 
    lifecycleCallbacks: { } 
從採購實體

簡化ORM的樣子:

X\Entity\Purchase: 
    repositoryClass: X\Repository\PurchaseRepository 
    type: entity 
    oneToMany: 
     addresses: 
      targetEntity: Address 
      mappedBy: purchase 
    id: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
    fields: 
     quantity: 
      type: integer 
     orderedAt: 
      type: datetime 
     toBeDeliveredAt: 
      type: datetime 
    lifecycleCallbacks: { } 

現在這些來自採購類的產品線會給我出錯

​​

說:

無論屬性 「地址」,也不是方法之一 「的getAddress()」, 「地址()」, 「isAddress()」, 「hasAddress()」, 「__get()」存在並且在類「X \ Entity \ Purchase」中具有公共訪問權限 。

這是絕對正確的,沒有財產address,並沒有任何方法,該非現有財產。

問題是種屬性名稱是addresses,有一種方法getAddresses但有些出錯。

現在的問題是爲什麼是「系統」(symfony?)搜索屬性名稱address?當然,我該如何解決這個問題?在表單提交時

更新

錯誤。該控制器是這樣的:

class DefaultController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     $purchase = new Purchase(); 
     $form = $this->createFormBuilder($purchase) 
      ->add('address', AddressType::class) 
      ->add('quantity', IntegerType::class) 
      ->add('toBeDeliveredAt', DateType::class) 
      ->add('comment', TextareaType::class) 
      ->add('save', SubmitType::class, array('label' => 'Submit')) 
      ->getForm(); 

     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($purchase); 
      $em->flush(); 
     } 


     return $this->render('X:Default:index.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
} 

而且地址類型如下:

class AddressType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('firstname', TextType::class) 
      ->add('email', EmailType::class); 
    } 
} 

感謝您的幫助!

如果需要整個採購類看起來是這樣的:

<?php 

namespace X\Entity; 

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

/** 
* Purchase 
*/ 
class Purchase 
{ 
    /** 
    * @var int 
    */ 
    private $id; 

    /** 
    * @var int 
    */ 
    private $quantity; 

    /** 
    * @var \DateTime 
    */ 
    private $orderedAt; 

    /** 
    * @var \DateTime 
    */ 
    private $toBeDeliveredAt; 

    /** 
    * @var bool 
    */ 
    private $delivered; 

    /** 
    * @var \DateTime 
    */ 
    private $deliveredAt; 

    /** 
    * @var bool 
    */ 
    private $payd; 

    /** 
    * @var \DateTime 
    */ 
    private $paydAt; 

    /** 
    * @var string 
    */ 
    private $comment; 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    */ 
    private $addresses; 

    /** 
    * 
    */ 
    public function __construct() 
    { 
     $this->addresses = new ArrayCollection(); 
    } 


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

    /** 
    * Set quantity 
    * 
    * @param integer $quantity 
    * @return Purchase 
    */ 
    public function setQuantity($quantity) 
    { 
     $this->quantity = $quantity; 

     return $this; 
    } 

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

    /** 
    * Set orderedAt 
    * 
    * @param \DateTime $orderedAt 
    * @return Purchase 
    */ 
    public function setOrderedAt($orderedAt) 
    { 
     $this->orderedAt = $orderedAt; 

     return $this; 
    } 

    /** 
    * Get orderedAt 
    * 
    * @return \DateTime 
    */ 
    public function getOrderedAt() 
    { 
     return $this->orderedAt; 
    } 

    /** 
    * @param \DateTime $toBeDeliveredAt 
    */ 
    public function setToBeDeliveredAt($toBeDeliveredAt) 
    { 
     $this->toBeDeliveredAt = $toBeDeliveredAt; 
    } 

    /** 
    * @return \DateTime 
    */ 
    public function getToBeDeliveredAt() 
    { 
     return $this->toBeDeliveredAt; 
    } 

    /** 
    * @param Address $address 
    * @return Address 
    */ 
    public function addAddress(Address $address) 
    { 
     $this->addresses[] = $address; 
     if($address->getPurchase() !== $this) { 
      $address->setPurchase($this); 
     } 
     return $this; 
    } 

    /** 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getAddresses() 
    { 
     return $this->addresses; 
    } 
} 
+0

當你有這個錯誤? – DOZ

+0

@DOZ在表單提交中,將包括問題中的部分 – caramba

+0

@DOZ問題更新與控制器indexAction和AddressType ... – caramba

回答

1

這個錯誤來自->add('address', AddressType::class)在PurchaseType。

試試這個:

->add('addresses', AddressType::class) 
+0

爲什麼CollectionType? – caramba

+1

錯誤對不起,我編輯我的答案 – DOZ

0

我也面臨着同樣的問題。但我能解決這個問題。

只需檢查您的entity.orm.yml文件,並從form字段中刪除您正在創建關係的字段。

$builder->add('question')->add('demographicYesNo')->add('questionSetId')->add('questionOptionTypeId')->add('questionSliderRange'); 

因此,我已刪除

插件( 'questionSetId') - >添加( 'questionOptionTypeId')

當我創建默認情況下在該領域的關係和symfony的在Form中添加這個。

謝謝,

Anirudh Sood。

相關問題