如何在 Symfony5 中为 "atk4\dsql" 设置全局数据库连接?

How to set up global database connection for "atk4\dsql" in Symfony5?

我想测试 SQL Builder 库 atk4/dsql with Symfony 5 and am trying to set up the database connection. I tried following these instructions in the official docs

我没有足够的 Symfony 经验来了解如何设置全局 class 以便 Atk4 库可以使用数据库连接详细信息(我确实在 .env 文件中输入了数据库详细信息) .

我有这样的代码:

<?php
namespace App\Repository;

use Atk4\Dsql\Query;

class UserRepository
{
    public function getUser($username) {
        $query = new Query();
        $query  ->table('user')
                ->where('username', $username)
                ;

        // Debug Output
        // print_r($query); die;
        return $query->getOne();
    }
}

但是当 运行 这时我只得到“调用成员函数 execute() on null”。

我已经检查过这个(太棒了)collection of explanations for PHP Errors, but could not find one for this problem. The closest I could find is "Fatal error: Call to a member function ... on a non-object or null”。它解释了如果 - 如上例所示 - $query 不是对象。但是 $query 绝对是一个对象(我使用 gettype($query) 得到了双重确认)。

因此我假设这是我缺少的数据库连接定义。

如何设置数据库连接并使 DSQL 在 Symfony 5 中的每个查询中使用它?还是我可能忽略了其他东西?

嗯,首先你必须为你的数据库设置连接并在此处描述https://dsql.readthedocs.io/en/develop/connection.html

$connection = \atk4\dsql\Connection::connect($dsn, $user, $pass);

然后将此 Connection 对象传递给 Query 或从 Connection 对象初始化查询。

// initialize Query object from Connection object
$query = $connection->dsql();

或者在您的特定情况下,您可以执行类似的操作来将连接传递给您的查询

use Atk4\Dsql\Connection;

class UserRepository
{
    /** @var Connection */
    public $connection;

    public function __construct(Connection $connection) {
        $this->connection = $connection;
    }

    public function getUser(string $username): ?array {
        return $this->connection->dsql()
            ->table('user')
            ->where('username', $username)
            ->getRow();
    }
}

// usage
$connection = \atk4\dsql\Connection::connect($dsn, $user, $pass);
$repo = new UserRepository($connection);
var_dump($repo->getUser('John'));

P.S。如果你只想 return 用户 Id 或其他一些字段,那么你可以使用 getOne() 方法,但还必须使用 field($fieldname) 方法来定义要 select 的单个字段。

P.P.S。从 ENV 文件或任何其他设置它们的地方获取 $dsn、$user 和 $pass 的位置和方式由您决定。