原则不更新简单的数组类型字段 - php

短篇小说(编辑)

可以存储数组而不是映射关联。在Symfony2中,使用collection Field Type相当容易。例如,使用此技术,您可以存储文本字段数组,该文本字段填充数组事件字段。但是,要更新数组,有一个技巧,@ Vadim Ashikhman在接受的答案中很好地解释了这个技巧。

很长的故事

有时,存储数组而不是映射关联是有用且更有效的。但是,一旦创建,如果该数组的大小不改变,更新该Array仍然很复杂?

许多人都有similar issue,但没有人找到解决此问题的适当方法。

一个团队可以组织许多活动。这些事件只是使用Doctrine而不是使用OneToMany关联存储在数组中。因此,实体事件未与学说映射。

实体事件(未与“学说”映射)

<?php

namespace Acme\TestBundle\Entity;

...

class Event
{

    /**
     * @Assert\NotBlank
     */
    private $name;

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }


}

实体团队

<?php

namespace Acme\TestBundle\Entity;

...

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="teams")  
 */
class Team 
{

/**
     * @ORM\Column(type="array")
     * @var array
     */
    protected $events;


    public function addEvent($event)
    {
        if (!in_array($event, $this->events, true)) {
            $this->events[] = $event;
        }

        return $this;
    }

    public function removeEvent($event)
    {
        if (false !== $key = array_search($event, $this->events, true)) {
            unset($this->events[$key]);
            $this->events = array_values($this->events);
        }

        return $this;
    }

    public function getEvents()
    {
        return $this->events;
    }

    public function setEvents(array $events)
    {
        $this->events = array();

        foreach ($events as $event) {
            $this->addEvent($event);
        }

        return $this;
    }

活动形式

<?php
namespace Acme\TestBundle\Form\Type;

...

class EventType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('name', 'text');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\Event',
            'cascade_validation' => true,
        ));
    }

    ...
}

团队形式

<?php

namespace Acme\TestBundle\Form\Type;

...

class TeamType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('events','collection', array(
            'type' => new EventType(),
            'allow_add'   => true,
            'allow_delete' => true,
            'prototype' => true,
            'by_reference' => false,
            'options' => array('data_class' => 'Acme\TestBundle\Entity\Event'),
            )
        );

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\Team',
        ));
    }
    ...

}

控制器

/**
 * Update a team
 *
 * @Route("update/{team_id}", name="updateTeamFromId")
 * @Template("AcmeTestBundle:Team:teamUpdate.html.twig")
 */
public function updateTeamAction($team_id, Request $request)
{

    $em = $this->getDoctrine()->getManager();

    $repository= $em->getRepository('AcmeTestBundle:Team');

    $team_to_update = $repository->find($team_id);

    $form = $this->createForm(new teamType(), $team_to_update);

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

        if ($form->isValid()){

            $em->persist($team_to_update);
            $em->flush();

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

    return array(
    'form' => $form->createView(),
    'team_id' => $team_id,
    );

}

参考方案

您可以在这里找到答案:

How to force Doctrine to update array type fields?

参考:

原则使用相同的运算符===比较旧版本之间的更改
和新的价值。运算符用于与
不同的数据总是返回true。还有另一种解决方法
此问题,您可以克隆需要更改的对象。

$items = $myEntityObject->getItems(); 
$items[0] = clone $items[0];
$items[0]->setSomething(123); 
$myEntityObject->setItems($items);

或更改setItems()方法

public function setItems($items) 
{
    if (!empty($items) && $items === $this->items) {
        reset($items);
        $key = key($items);
        $items[$key] = clone $items[$key];
    }
    $this->items = $items; 
}

phpWord中的粗体,空格和缩进文本 - php

我有一些要加粗的文本,与前几段和后几段分开并缩进。我不能让所有三个属性一起工作。这适用于粗体和空格:$section = $phpWord->addSection(); $section->addText( 'Re: Your Application for Post of Security Guard', array(�…

PHP数组可以这样做吗? - php

可以说;我有一个$ friends数组,其中有2,000个不同的friendID号+我有一个带有10,000 bulletinID号的$ bulletins数组,该$ bulletins数组还将具有另一个值,该ID的用户ID是发布公告条目的用户现在可以获取所有具有与FriendsID数组中的userID匹配的userID的bulletinID号吗?甚至有可能…

哪个更好的做法?从Jquery响应获取HTML - php

这只是一个问题,以了解人们如何以及如何做到这一点,但是假设用户向列表中添加了一些内容,完成后,它将运行下面的ajax并更新.user-stream-list$.ajax({ url: "user-stream-list.php", success: function(data){ $(".user-stream-list…

php:是否有充分的理由引用所有数组键/索引? - php

我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…

部署时文件存储无法在laravel项目上运行 - php

我有在我的本地主机服务器上工作的laravel项目,但是当我在000webhostapp.com Webhost域上部署它时。文件存储库不起作用。它保存数据,但不保存文件或图像。继承人的链接。 https://vincetestsite.000webhostapp.com/products_list您可以通过用户名登录-密码和密码-123和下面的代码。 $p…