Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2关系实体+;形式_Php_Mysql_Forms_Symfony_Relationship - Fatal编程技术网

Php Symfony2关系实体+;形式

Php Symfony2关系实体+;形式,php,mysql,forms,symfony,relationship,Php,Mysql,Forms,Symfony,Relationship,我试图编写一个表单来提交MySQL DB,但我无法让它正常工作,我尝试了很多方法(单独的表单,创建一个->add('foo',new foo()))到一个字段,尝试用普通HTML表单解析纯SQL是我唯一的解决方案,这显然不是最好的 这是我的数据库结构: ![在此处输入图像描述][1] 如您所见,我需要在编写注释的用户之间插入注释文本区域,以票证注释,等等 在crmentity的description字段中 然后在ticketcf上,我需要从表单中提交的字段如下(因为您不知道我是否因为字段名而不告

我试图编写一个表单来提交MySQL DB,但我无法让它正常工作,我尝试了很多方法(单独的表单,创建一个
->add('foo',new foo())
)到一个字段,尝试用普通HTML表单解析纯SQL是我唯一的解决方案,这显然不是最好的

这是我的数据库结构:

![在此处输入图像描述][1]

如您所见,我需要在编写注释的用户之间插入
注释
文本区域,以
票证注释
,等等

crmentity
description
字段中

然后在
ticketcf
上,我需要从表单中提交的字段如下(因为您不知道我是否因为字段名而不告诉您):

当然,对于提交的表单,每个表都需要有相同的
ticketid
id,因此我们可以通过一个简单的查询来检索它

使用普通SQL而不是DQL和Symfony2表单将很容易,但这不是一个好方法

编辑 这是我新创建的实体
Ticket.php
,它与上面的表有关系…如果有人能检查一下并告诉我是否可以

ticket.php

<?php 
namespace WbsGo\clientsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * VtigerTicketcomments
 *
 * @ORM\Table(name="vtiger_troubletickets")
 * @ORM\Entity(repositoryClass="WbsGo\clientsBundle\Entity\TicketsRepository")
 */

class Tickets
{
    /**
     * @var \WbsGo\clientsBundle\Entity\VtigerCrmentity
     *
     * @ORM\OneToOne(targetEntity="WbsGo\clientsBundle\Entity\VtigerCrmentity")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="ticketid", referencedColumnName="crmid", unique=true)
     * })
     * @ORM\Id
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="ticket_no", type="string", length=100, nullable=false)
     *
     */
    private $ticketNo;

    /**
     * @var string
     *
     * @ORM\Column(name="groupname", type="string", length=100, nullable=true)
     */
    private $groupName;

    /**
     * @ORM\ManyToOne(targetEntity="VtigerContactdetails")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parent_id", referencedColumnName="contactid", unique=true)
     * })
     */
    private $parentId;

    /**
     * @ORM\ManyToOne(targetEntity="VtigerAssets")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="product_id", referencedColumnName="assetsid", unique=true)
     * })
     */
    private $productId;

    /**
     * @var string
     *
     * @ORM\Column(name="priority", type="string", length=100, nullable=true)
     */
    private $priority;

    /**
     * @var string
     *
     * @ORM\Column(name="severity", type="string", length=100, nullable=true)
     */
    private $severity;

    /**
     * @var string
     *
     * @ORM\Column(name="status", type="string", length=100, nullable=true)
     */
    private $status;

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

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

    /**
     * @var text
     *
     * @ORM\Column(name="solution", type="text", nullable=true)
     */
    private $solution;

    /**
     * @var text
     *
     * @ORM\Column(name="update_log", type="text", nullable=true)
     */
    private $updateLog;

    /**
     * @var integer
     *
     * @ORM\Column(name="version_id", type="integer", nullable=true)
     */
    private $versionId;

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

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

    /**
     * @var integer
     *
     * @ORM\Column(name="from_portal", type="integer", nullable=true)
     */
    private $fromPortal;

    /**
     * @ORM\OneToMany(targetEntity="VtigerTicketcomments", mappedBy="ticketid")
     * 
     */
    protected $comments;

    /**
     * @ORM\OneToOne(targetEntity="VtigerTicketcf", mappedBy="id")
     */
    protected $ticketcf;
    /**
     * @ORM\OneToOne(targetEntity="VtigerCrmentity", mappedBy="crmid")
     */
    protected $crmtable;
}
<?php

namespace WbsGo\clientsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * VtigerTicketcf
 *
 * @ORM\Table(name="vtiger_ticketcf")
 * @ORM\Entity
 */
class VtigerTicketcf
{
    /**
     * @var string
     *
     * @ORM\Column(name="cf_546", type="string", length=255, nullable=true)
     */
    private $cf546;

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

    /**
     * @var string
     *
     * @ORM\Column(name="cf_589", type="string", length=3, nullable=true)
     */
    private $cf589;

    /**
     * @var string
     *
     * @ORM\Column(name="cf_590", type="string", length=3, nullable=true)
     */
    private $cf590;

    /**
     * @var string
     *
     * @ORM\Column(name="cf_592", type="string", length=100, nullable=true)
     */
    private $cf592;

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

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

    /**
     * @var string
     *
     * @ORM\Column(name="cf_675", type="string", length=50, nullable=true)
     */
    private $cf675;

    /**
     * @var float
     *
     * @ORM\Column(name="cf_689", type="decimal", nullable=true)
     */
    private $cf689;

    /**
     * @var float
     *
     * @ORM\Column(name="cf_690", type="decimal", nullable=true)
     */
    private $cf690;

    /**
     * @var float
     *
     * @ORM\Column(name="cf_691", type="decimal", nullable=true)
     */
    private $cf691;

    /**
     * @var float
     *
     * @ORM\Column(name="cf_693", type="decimal", nullable=true)
     */
    private $cf693;

    /**
     * @var string
     *
     * @ORM\Column(name="cf_746", type="string", length=50, nullable=true)
     */
    private $cf746;

    /**
     * @var string
     *
     * @ORM\Column(name="cf_747", type="string", length=50, nullable=true)
     */
    private $cf747;

    /**
     * @var string
     *
     * @ORM\Column(name="cf_748", type="string", length=50, nullable=true)
     */
    private $cf748;

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

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

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

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

    /**
     * @var string
     *
     * @ORM\Column(name="cf_770", type="string", length=50, nullable=true)
     */
    private $cf770;

    /**
     * @var \WbsGo\clientsBundle\Entity\Tickets
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="WbsGo\clientsBundle\Entity\Tickets")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="ticketid", referencedColumnName="ticketid", unique=true)
     * })
     * 
     */
    private $id;
}
<?php

namespace WbsGo\clientsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * VtigerTicketcomments
 *
 * @ORM\Table(name="vtiger_ticketcomments")
 * @ORM\Entity
 */
class VtigerTicketcomments
{
    /**
     * @var string
     *
     * @ORM\Column(name="comments", type="text", nullable=true)
     */
    private $comments;

    /**
     * @var integer
     *
     * @ORM\Column(name="ownerid", type="integer", nullable=false)
     */
    private $ownerid;

    /**
     * @var string
     *
     * @ORM\Column(name="ownertype", type="string", length=10, nullable=true)
     */
    private $ownertype;

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

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

    /**
     * @var \WbsGo\clientsBundle\Entity\Tickets
     * @ORM\OneToOne(targetEntity="WbsGo\clientsBundle\Entity\Tickets")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="ticketid", referencedColumnName="ticketid", unique=true)
     * })
     * 
     */
    private $ticketid;
}
<?php

namespace WbsGo\clientsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * VtigerCrmentity
 *
 * @ORM\Table(name="vtiger_crmentity")
 * @ORM\Entity
 */
class VtigerCrmentity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="smcreatorid", type="integer", nullable=false)
     */
    private $smcreatorid;

    /**
     * @var integer
     *
     * @ORM\Column(name="smownerid", type="integer", nullable=false)
     */
    private $smownerid;

    /**
     * @var integer
     *
     * @ORM\Column(name="modifiedby", type="integer", nullable=false)
     */
    private $modifiedby;

    /**
     * @var string
     *
     * @ORM\Column(name="setype", type="string", length=30, nullable=false)
     */
    private $setype;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", nullable=true)
     */
    private $description;

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

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

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

    /**
     * @var string
     *
     * @ORM\Column(name="status", type="string", length=50, nullable=true)
     */
    private $status;

    /**
     * @var integer
     *
     * @ORM\Column(name="version", type="integer", nullable=false)
     */
    private $version;

    /**
     * @var integer
     *
     * @ORM\Column(name="presence", type="integer", nullable=true)
     */
    private $presence;

    /**
     * @var integer
     *
     * @ORM\Column(name="deleted", type="integer", nullable=false)
     */
    private $deleted;

    /**
     * @var integer
     *
     * @ORM\Column(name="crmid", type="integer")
     * @ORM\Id
     */
    private $crmid;

}
即使我只搜索一个ID,我也可以检索一个X票证数组,因为如果ID1有4个元素,那么我得到了4个相同的票证,每个注释一个……我如何才能使它只有一个带有
comments=>array(…)
的票证,这样我就可以在细枝中的
comments
数组中进行迭代

而且
vTigerMementity.Description
也不起作用,它返回此错误

注意:未定义索引:crmid in /var/www/wbsgo/dev.wbsgo/vendor/doctrine/orm/lib/doctrine/orm/Query/SqlWalker.php 第826行


我没有getter和setter,因为我正在再次生成它们,如果注释正常,实体将使用get/set正确更新,并且我的表单将能够使用关系提交,对吗?

您可以通过将
mapped
选项设置为false来嵌入表示底层实体字段的表单,例如:

->add('comments', 'collection', array(
    'type'   => new VtigerTicketcommentsType(),
    'mapped' => false
))
但是,在分配表单数据时要小心,因为
$form->submit($data)
不会将数据设置为注释对象的基础集合。您需要在控制器内手动处理它们。您可以使用
$form->getExtraData()访问标记为未映射的数据
将数据提交到表单后

如果希望Symfony自动将数据设置为注释,则需要在
vTigerToubleTickets
VtigerTicketcomments
实体之间建立关系,根据问题标题,这些实体是不存在的,请尽量避免

编辑:

表单类型绑定到给定的实体类。默认情况下,添加到表单类型的每个字段必须在声明的实体类中具有基础属性(如果属性未定义为public,则必须具有getter/setter对)。当从表单类型(
OpenTicketType
)和数据(
new VtigerTroubletickets()
)构造表单对象时:

$form = $this->createForm(new OpenTicketType(), new VtigerTroubletickets());
表单与您刚刚创建的对象中存在的数据绑定。该对象没有comments属性,更重要的是,表单本身知道字段未映射,并且它不会尝试从该对象填充字段,因此集合自然呈现为空,因为没有传递有关注释的数据

若要通过此操作,可以传递数据数组而不是新创建的对象(注意:值可能为空,但注释数组的长度必须大于0-注释必须存在,但没有实际数据)

这是表单创建。发布表单时,除了构造表单外,还有一个额外的步骤。请求数据必须绑定到表单上,因此您可以执行
$form->submit($request)
。现在表单和基础实体对象将填充新数据

$form->getExtraData()
只是一种访问表单持有的数据的方法,它没有映射到底层对象,而comments字段就是底层对象,因为我们将其标记为底层对象

除了使用
getExtraData
-手动从表单中提取数据之外,您还可以使用getter/setters将属性
注释添加到
vTigerToubleTickets
实体中,而不将其标记为db列。这样,您可以删除表单类型中的
mapped=>false
选项,表单将自动读取/popu后期评论属性。 但是,在持久化时,这些注释不会被考虑用于存储,因此您必须手动处理它们。同样,从数据库获取对象时,comments属性将为空,因此在创建表单之前,您必须向对象添加一些注释,例如:

$tickets = new VtigerTroubletickets();
$tickets->setComments(....);
$form = $this->createForm(new OpenTicketType(), $tickets);

通过将
mapped
选项设置为false,可以嵌入表示基础实体字段的表单,例如:

->add('comments', 'collection', array(
    'type'   => new VtigerTicketcommentsType(),
    'mapped' => false
))
但是,在分配表单数据时要小心,因为
$form->submit($data)
不会将数据设置为注释对象的基础集合。您需要在控制器内手动处理它们。您可以使用
$form->getExtraData()访问标记为未映射的数据
将数据提交到表单后

如果希望Symfony自动将数据设置为注释,则需要在
vTigerToubleTickets
VtigerTicketcomments
实体之间建立关系,根据问题标题,这些实体是不存在的,请尽量避免

编辑:

表单类型绑定到给定的实体类。默认情况下,添加到表单类型的每个字段必须在声明的实体类中具有基础属性(如果属性未定义为public,则必须具有getter/setter对)。从表单类型(
OpenTicketType
)和数据(
new VtigerTroubletick)构造表单对象时
[
  "title"    => "...",
  "priority" => "...",
  "solution" => "...",
  "comments" => [
    0 => [/* comment 0 data */],
    1 => [/* comment 1 data */],
    .......
  ]
]
$tickets = new VtigerTroubletickets();
$tickets->setComments(....);
$form = $this->createForm(new OpenTicketType(), $tickets);
// In the controller
$formData = array();
$formData['ticket'] = new Ticket(),
$formData['comments'] = array(new Comment(), new Comment());

$form = $this->createForm(new TicketCommentsType(), $formData);
$form->handleRequest($request);

if ($form->isValid()) 
{ 
    $formData = $form->getData();
    $ticket   = $formData['ticket'];
    $comments = $formData['comments'];

    // Persist ticket

    // Persist comments
class TicketCommentsFormType

public function buildForm(

    $builder->add('ticket',new OpenTicketType());
    $builder->add('comments','collection',array(
            'type' => new VtigerTicketcommentsType()