从 Symfony2 中的实体到数据库的 DBAL 连接

Posted

技术标签:

【中文标题】从 Symfony2 中的实体到数据库的 DBAL 连接【英文标题】:DBAL Connection to database from Entity in Symfony2 【发布时间】:2013-08-04 12:37:36 【问题描述】:

我已经创建了这个实体:

<?php
namespace MyProject\MyBundle\Entity;

class User 
    private $id;

    function __construct($id) 
        $this->id = $id;
    

    public function setName($name) 
        $sql = "UPDATE users SET name=:name WHERE id=:id";
        $stmt = $this->connection->prepare($sql);
        $stmt->execute(array('name' => '$name', 'id' => $this->id));
    
)

如何从它连接到数据库?

我从这个控制器调用这个实体:

<?php
namespace MyProject\MyBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use MyProject\MyBundle\Entity;

class MyController extends Controller 
    public function indexAction() 
        $user = new User(1);
        $user->setName("Tom");
    

【问题讨论】:

【参考方案1】:

您需要使用学说实体管理器http://symfony.com/doc/current/book/doctrine.html#persisting-objects-to-the-database

编辑: 不要在模型中查询,而是在实体存储库中查询,如下所示:

public function setName(name, id)

    $sql = "UPDATE users SET name=:name WHERE id=:id";
    $stmt = $this->getEntityManager()
        ->getConnection()
        ->prepare($sql);

    $stmt->execute(array('name' => $name, 'id' => $id));

【讨论】:

实际上我的例子中的实体并没有映射到一个真实的表,所以我想做一个 DBAL 连接来编写一个来自实体的自定义查询。 public setName($name) -> public function setName($name) ?【参考方案2】:

有一个食谱文章:http://symfony.com/doc/current/cookbook/doctrine/dbal.html,它展示了如何在不通过实体管理器的情况下获取和使用 dbal 连接。

但是像@Rpg600 我有点不明白你为什么要这么做。

您可能应该将此作为服务并注入连接。

也许:

class UserCustomQuery($conn)

    public function __construct($conn)  $this->conn = $conn; 

    public function setName($userId,$name)
    
        ....

控制器:

$userCustomQuery = $this->get('user.custom.query');
$userCustomQuery->setName(1,'Tom');

【讨论】:

以上是关于从 Symfony2 中的实体到数据库的 DBAL 连接的主要内容,如果未能解决你的问题,请参考以下文章

通过 Symfony2 配置 DBAL 以设置字符集

PostgreSQL 咨询锁不适用于 Doctrine 的 DBAL

Symfony2/Doctrine:如何从实体类中持久化一个实体?

如何从 symfony2 中删除实体

在 symfony2 中创建表

Symfony 2.8(Wamp):[Doctrine\DBAL\Exception\ConnectionException] PDOException:SQLSTATE[HY000] [2002]