2015-09-06 128 views
1

我有一个预算的形式从客户端实体在select字段列出的数据。总结,预算和客户是相互关联的。预算有client_id列,即假设通过从所选客户端获取id值来存储它。坚持与数据相关实体

<form action="{{ path('panel_add_budget') }}" method="POST"> 
    <strong>Cliente</strong> 
    <div class="form-group"> 
     <select name="cdg_budget_type[client_id]" class="form-control"> 
      {% for client in clients %} 
       <option value="{{ client.id }}">{{ client.name }}</option> 
      {% endfor %} 
     </select> 
    </div> 

    <div class="form-group"> 
     {{ form_row(form.address) }} 
    </div> 
    <div class="form-group"> 
     {{ form_row(form.installments) }} 
    </div> 
    <div class="form-group"> 
     {{ form_row(form.check_days) }} 
    </div> 
    <div class="form-group"> 
     {{ form_row(form.date_start) }} 
    </div> 
    <div class="form-group"> 
     {{ form_row(form.total_value) }} 
    </div> 

    <button type="submit" class="btn btn-success">Adicionar</button> 
</form> 

我的客户单位:

class Client 
{ 
    /** 
    * @var integer 
    */ 
    private $id; 

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

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

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

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

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

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

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

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

    /** 
    * @var integer 
    */ 
    private $budget; 


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

    /** 
    * Set name 
    * 
    * @param string $name 
    * @return Client 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

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

    /** 
    * Set phone 
    * 
    * @param string $phone 
    * @return Client 
    */ 
    public function setPhone($phone) 
    { 
     $this->phone = $phone; 

     return $this; 
    } 

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

    /** 
    * Set email 
    * 
    * @param string $email 
    * @return Client 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

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

    /** 
    * Set streetName 
    * 
    * @param string $streetName 
    * @return Client 
    */ 
    public function setStreetName($streetName) 
    { 
     $this->streetName = $streetName; 

     return $this; 
    } 

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

    /** 
    * Set district 
    * 
    * @param string $district 
    * @return Client 
    */ 
    public function setDistrict($district) 
    { 
     $this->district = $district; 

     return $this; 
    } 

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

    /** 
    * Set number 
    * 
    * @param string $number 
    * @return Client 
    */ 
    public function setNumber($number) 
    { 
     $this->number = $number; 

     return $this; 
    } 

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

    /** 
    * Set city 
    * 
    * @param string $city 
    * @return Client 
    */ 
    public function setCity($city) 
    { 
     $this->city = $city; 

     return $this; 
    } 

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

    /** 
    * Set zipCode 
    * 
    * @param string $zipCode 
    * @return Client 
    */ 
    public function setZipCode($zipCode) 
    { 
     $this->zipCode = $zipCode; 

     return $this; 
    } 

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

    /** 
    * Set budget 
    * 
    * @param integer $budget 
    */ 
    function setBudget($budget) 
    { 
     $this->budget = $budget; 
    } 

    /** 
    * Get budget 
    * 
    * @return integer 
    */ 
    function getBudget() 
    { 
     return $this->budget; 
    } 
} 

经济实体:

class Budget 
{ 
    /** 
    * @var integer 
    */ 
    private $id; 

    /** 
    * @var integer 
    */ 
    private $clientId; 

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

    /** 
    * @var integer 
    */ 
    private $installments; 

    /** 
    * @var integer 
    */ 
    private $checkDays; 

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

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

    /** 
    * @var decimal 
    */ 
    private $totalValue; 

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

    /** 
    * Set clientId 
    * 
    * @param integer $clientId 
    * @return Budget 
    */ 
    public function setClientId($clientId) 
    { 
     $this->clientId = $clientId; 

     return $this; 
    } 

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

    /** 
    * Set address 
    * 
    * @param string $address 
    * @return Budget 
    */ 
    public function setAddress($address) 
    { 
     $this->address = $address; 

     return $this; 
    } 

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

    /** 
    * Set installments 
    * 
    * @param integer $installments 
    * @return Budget 
    */ 
    public function setInstallments($installments) 
    { 
     $this->installments = $installments; 

     return $this; 
    } 

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

    /** 
    * Set checkDays 
    * 
    * @param integer $checkDays 
    * @return Budget 
    */ 
    public function setCheckDays($checkDays) 
    { 
     $this->checkDays = $checkDays; 

     return $this; 
    } 

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

    /** 
    * Set dateStart 
    * 
    * @param \DateTime $dateStart 
    * @return Budget 
    */ 
    public function setDateStart($dateStart) 
    { 
     $this->dateStart = $dateStart; 

     return $this; 
    } 

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

    /** 
    * Set dateCreated 
    * 
    * @param \DateTime $dateCreated 
    * @return Budget 
    */ 
    public function setDateCreated($dateCreated) 
    { 
     $this->dateCreated = $dateCreated; 

     return $this; 
    } 

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

    /** 
    * Set totalValue 
    * 
    * @param decimal $totalValue 
    * @return Budget 
    */ 
    public function setTotalValue($totalValue) 
    { 
     $this->totalValue = $totalValue; 

     return $this; 
    } 

    /** 
    * Get totalValue 
    * 
    * @return decimal 
    */ 
    public function getTotalValue() 
    { 
     return $this->totalValue; 
    } 
} 

我的一对多客户与预算的关系:

CDG\PanelBundle\Entity\Client: 
    type: entity 
    table: client 
    repositoryClass: CDG\PanelBundle\Entity\ClientRepository 
    id: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
    fields: 
     name: 
      type: string 
      length: 255 
     phone: 
      type: string 
      length: 255 
     email: 
      type: string 
      length: 255 
     streetName: 
      type: string 
      length: 255 
      column: street_name 
     district: 
      type: string 
      length: 255 
     number: 
      type: string 
      length: 255 
     city: 
      type: string 
      length: 255 
     zipCode: 
      type: string 
      length: 255 
      column: zip_code 
    oneToMany: 
     budget: 
      targetEntity: Budget 
      mappedBy: clientId 
    lifecycleCallbacks: { } 

而且随着经济的我多对一关系客户:

CDG\PanelBundle\Entity\Budget: 
    type: entity 
    table: budget 
    repositoryClass: CDG\PanelBundle\Entity\BudgetRepository 
    id: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
    fields: 
     address: 
      type: string 
      length: 255 
     installments: 
      type: integer 
     checkDays: 
      type: integer 
      column: check_days 
     dateStart: 
      type: datetime 
      column: date_start 
     dateCreated: 
      type: datetime 
      column: date_created 
     totalValue: 
      type: decimal 
      column: total_value 
      nullable: true 
    manyToOne: 
     clientId: 
      targetEntity: Client 
      inversedBy: budget 
      joinColumn: 
       name: client_id 
       referencedColumnName: id 
    lifecycleCallbacks: { } 

要完成,我的addAction,从BudgetController

public function addAction(Request $request) 
{ 
    $form = $this->createForm(new BudgetType()); 

    if ($request->getMethod() == 'POST') { 
     $form->handleRequest($request); 

     if ($form->isValid()) { 
      $manager = $this->getDoctrine()->getManager(); 
      $manager->persist($form->getData()); 
      $manager->flush(); 

      $this->addFlash('success', 'Novo orçamento adicionado'); 

      return $this->redirect($this->generateUrl('panel_budgets')); 
     } 
    } 

    return $this->render('PanelBundle:Budget:add.html.twig', array(
     'clients' => $manager->getRepository('PanelBundle:Client')->findAll(), 
     'form' => $form->createView() 
    )); 
} 

当提交表单,则抛出异常:

警告:spl_object_hash()预计参数1是对象,给出的整数

public function getEntityState($entity, $assume = null) 
{ 
    $oid = spl_object_hash($entity); 
    if (isset($this->entityStates[$oid])) { 
     return $this->entityStates[$oid]; 

它的堆栈跟踪:

at ErrorHandler ->handleError ('2', 'spl_object_hash() expects parameter 1 to be object, integer given', '/home/gabriel/Documents/CasaDoGesso/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php', '1389', array('entity' => '2', 'assume' => '2')) 
at spl_object_hash ('2') 
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 1389 + 
at UnitOfWork ->getEntityState ('2', '2') 
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 788 + 
at UnitOfWork ->computeAssociationChanges (array('fieldName' => 'clientId', 'targetEntity' => 'CDG\PanelBundle\Entity\Client', 'inversedBy' => 'budget', 'joinColumns' => array(array('referencedColumnName' => 'id', 'name' => 'client_id')), 'type' => '2', 'mappedBy' => null, 'isOwningSide' => true, 'sourceEntity' => 'CDG\PanelBundle\Entity\Budget', 'fetch' => '2', 'cascade' => array(), 'isCascadeRemove' => false, 'isCascadePersist' => false, 'isCascadeRefresh' => false, 'isCascadeMerge' => false, 'isCascadeDetach' => false, 'sourceToTargetKeyColumns' => array('client_id' => 'id'), 'joinColumnFieldNames' => array('client_id' => 'client_id'), 'targetToSourceKeyColumns' => array('id' => 'client_id'), 'orphanRemoval' => false), '2') 
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 687 + 
at UnitOfWork ->computeChangeSet (object(ClassMetadata), object(Budget)) 
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 404 + 
at UnitOfWork ->computeScheduleInsertsChangeSets() 
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 711 + 
at UnitOfWork ->computeChangeSets() 
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 297 + 
at UnitOfWork ->commit (null) 
in vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php at line 340 + 
at EntityManager ->flush() 
in src/CDG/PanelBundle/Controller/BudgetController.php at line 36 + 
at BudgetController ->addAction (object(Request)) 
at call_user_func_array (array(object(BudgetController), 'addAction'), array(object(Request))) 
in app/bootstrap.php.cache at line 3109 + 
at HttpKernel ->handleRaw (object(Request), '1') 
in app/bootstrap.php.cache at line 3071 + 
at HttpKernel ->handle (object(Request), '1', true) 
in app/bootstrap.php.cache at line 3222 + 
at ContainerAwareHttpKernel ->handle (object(Request), '1', true) 
in app/bootstrap.php.cache at line 2444 + 
at Kernel ->handle (object(Request)) 
in web/app_dev.php at line 28 + 

这并不意味着任何东西给我。我不知道该怎么办。其他的解决方案根本没有帮助我。如果你需要更多的代码,请问我,我会编辑它。谢谢。

回答

3

我建议你在你的实体使用注释,并且开始使用formbuilder。还要向客户实体添加一个__toString()方法!

您的实体:

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\Common\Collections\ArrayCollection; 

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

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

    // YOUR OTHER CLIENT FIELDS 

    /** 
    * @ORM\OneToMany(targetEntity="Budget", mappedBy="client") 
    **/ 
    private $budgets; 

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

    /* this function is required to present the entity as a string */ 
    public function __toString() { 
     return $this->name; 
    } 

} 

和第二:

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

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

    // YOUR BUDGET FIELDS 

    /** 
    * @ORM\ManyToOne(targetEntity="Client", inversedBy="budgets") 
    * @ORM\JoinColumn(name="client_id", referencedColumnName="id") 
    **/ 
    private $client; 

} 

然后把从项目主目录下的控制台命令: (也许你要输入单词PHP每一个命令

app/console doctrine:generate:entities AppBundle 
app/console doctrine:schema:update --force 
app/console doctrine:generate:crud AppBundle:Client 
(type YES by the question Do you want to generate the "write" actions [no]?) 
app/console doctrine:generate:crud AppBundle:Budget 
(type YES by the question Do you want to generate the "write" actions [no]?) 
之前)

看一看新路线:

app/console router:debug 

正如你可以看到你可以浏览到

网/ app_dev.php /客户/

web/app_dev。php/budget/并且看看!

然后打开../src/AppBundle/Form/BudgetType.php在编辑器中,你会发现这条规则:

$builder 
     ->add('client') 
    ; 

这是在客户端属性添加到窗体。 Symfony自动将此表单字段设置为entity formtype。你可以这样写:

$builder 
    ->add('client', 'entity', array(
     'class' => 'AppBundle:Client', 
     'empty_value' => '', 
    )) 
; 

所以现在你可以在预算表中选择你的客户。

正如您可能已经注意到的那样,这些命令还为您添加了ClientController和BudgetController。 有关formtypes的更多信息,请参阅文档。

+0

在我的Client实体中在我的'BudgetType'和'__toString()'方法中添加'entity'字段类型解决了这个问题。我不需要做其他任何事情,比如新的路线和新的Bundle,这会破坏我的项目结构。对于你的建议:我宁愿使用YAML代替注释,因为对我来说代码看起来更有组织,即使我必须写更多。无论如何,谢谢。 – mfgabriel92

+0

很高兴听到你可以解决它。仍然不得不说,你应该使用formbuilder。它最好的就是生成表单。 –

+0

你说这个formbuilder是什么?自动生成还是其他东西?教义产生形式和东西的方式真是丑陋而混乱。我认为在生成所有内容之前理解发生的事情非常重要。面对这样的问题是很好的,甚至有人愿意为你写出巨大的解决方案。再次感谢你。 :) – mfgabriel92