【问题标题】:Symfony update Entity value + 1Symfony 更新实体值 + 1
【发布时间】:2025-04-21 18:05:02
【问题描述】:

我想在更新现有数据库条目时总结或相加。

由于我必须使用 MagicCalls,我只是想知道如何处理这个问题。

在原始 sql 中,我会这样做:

UPDATE table SET value= value + 1 WHERE ....

但在这种情况下,我完全不知道如何解决。

我的代码如下:

实体:

class Properties
{

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

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

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

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

现在,我通过

获取这些列名
$metadata = $em->getClassMetadata($className);
$columnNames=$metadata->getColumnNames();

我收到一个数组,我可以对它进行 foreach 并向它们中的每一个添加值,我必须使用访问器将其写回:

$properties= new Properties();
$accessor = PropertyAccess::createPropertyAccessorBuilder()
                        ->enableMagicCall()
                        ->getPropertyAccessor();


 foreach($columnNames as $merkmale) {
     $accessor->setValue($properties, $merkmale, 1);
 }

那么如何通过计数来处理更新?我错过了一些我猜的东西

【问题讨论】:

    标签: mysql symfony sum add


    【解决方案1】:

    为什么不使用Lifecycle callbacks?这样您就可以选择最适合您的情况的doctrine event,并通过一种方法增加您需要的所有值。

    /**
    * @ORM\Entity()
    * @ORM\HasLifecycleCallbacks()
    */
    class Properties
    {
        /**
        * @var string
        *
        * @ORM\Column(name="Sport", type="string", length=11, nullable=true)
        */
        private $sport;
    
        /**
        * @var string
        *
        * @ORM\Column(name="Entertainment", type="string", length=11, nullable=true)
        */
        private $entertainment;
    
        /**
        * @var string
        *
        * @ORM\Column(name="Wellness", type="string", length=11, nullable=true)
        */
        private $wellness;
    
        /**
        * @ORM\PrePersist
        */
        public function incrementValues()
        {
            $this->entertainment = 1; //you don't need any magic any more
            $this->wellness = $this->wellness + 5; //you can access your entity values directly
        }
    
    }
    

    您需要做的就是用@ORM\HasLifecycleCallbacks() 注释您的实体并添加您还需要用给定事件注释的方法,例如@ORM\PrePersist,并且每次发生此事件时,doctrine 都会调用此方法

    【讨论】:

    • Awww...还没有看到这个存在。但如果我没有误解,它总是会更新所有给定的字段。就我而言,可能只有特殊字段需要更新。例如,输入数组仅包含必须更新的值“sport”。
    • 不,学说只会调用带有事件注释的方法 - 您将更新哪些字段只是您将在此方法中放入的逻辑问题
    • 对不起。我想我不明白 :( 例如,如果有一个带有 ['sport','wellness'] 的数组,我将使用 MagicCall 更新这两个字段,该方法应该是什么样的?跨度>
    • 现在我不明白。你想增加什么(+1)?你不能增加数组。什么是 MagicCall?
    • 我得到了数组中实体的值。因此我需要使用 MagicCall,例如。 PropertyAccessor 将这些写回。