如何修改 Symfony ORM 插入\更新查询

Posted

技术标签:

【中文标题】如何修改 Symfony ORM 插入\\更新查询【英文标题】:How to modify Symfony ORM insert\update query如何修改 Symfony ORM 插入\更新查询 【发布时间】:2021-03-10 03:47:13 【问题描述】:

我有一个迁移到 Symfony 的项目,该项目有多个表,还有一些表迁移到 ORM,但现在我需要从 Symfony 验证/更新到具有实体但不受 ORM 管理的表。问题在于需要一些值的非空列,而在实体中,由于表关系,我无法定义该值。

可以在提交到数据库之前编辑 mysql 查询。

例如我有实体:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Table(name="p_user")
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User

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

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

    /**
     * @var Permission
     *
     * @ORM\ManyToOne(targetEntity="Permission", inversedBy="user", cascade="persist", "remove")
     * @ORM\JoinColumn(name="permission_id", referencedColumnName="permission_id", onDelete="CASCADE")
     */
    private $permission;

permission_id 可以为空,但在数据库中不为空,默认值为 0,name 相同,但默认值为 ''。

这意味着当我让flush,ORM 执行INSERT INTO p_user (name, permission_id) VALUES ('name', null),但我也想执行INSERT INTO p_user (name) VALUES ('name')

按照我的意愿去做是可能的。

【问题讨论】:

调整Doctrine生成的插入/更新sql代码是不切实际的。只需使用:private $permission = 0;设置默认值。 如果您有解决方案,请使用答案部分而不是将其添加到问题中。 【参考方案1】:

为此,您可以提供默认值。

private $permission = 0;

private $name = '';

【讨论】:

不知道为什么,但这不起作用,它设置为 null 而没有定义值 我喜欢创建自定义 nulltype 的解决方案,但现在我的问题是 ManyToOne、OneToOne、OneToMany 关系

以上是关于如何修改 Symfony ORM 插入\更新查询的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 实体连接或学说查询连接

Symfony2 实现 PATCH 方法来更新用户字段

如何在学说 ORM Symfony 4.1 中使用 array_agg?

级联持久性不工作(Doctrine ORM + Symfony 2)

如何使用 symfony 在教义查询构建器中选择表之间的特定连接?

更新关系映射后,Symfony 2 原则坚持不起作用