2016-07-27 15 views
0

2つの単純なオブジェクトを設定しようとしていますPurchaseAddress。アドレスエンティティから1対多のクリティカル - 未知のPHP例外Symfony Component PropertyAccess Exception NoSuchPropertyException

つ購入複数のアドレス(購入アドレス、請求書のアドレス)を持つことができ

簡体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: { } 
:購入エンティティから

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は次のようになります

購入クラスのこれらの行でエラーが発生します

​​

言っ:

どちらのプロパティ "アドレス" も方法の一つ "の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(), 
     )); 
    } 
} 

そしてAddressTypeには、次のようになります助けるため

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問題の部品が含まれます - >(「アドレス」)を追加しますか? – caramba

答えて

1

エラーがPurchaseTypeに->add('address', AddressType::class)から来ています。

はこれを試してみてください:

->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')を削除した - >私は、デフォルトでは、この分野での関係とsymfonyを作成したので( 'questionOptionTypeId')

を追加これをフォームに追加します。

ありがとう、

Anirudh Sood。