如何在 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 的位置和方式由您决定。
我想测试 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 的位置和方式由您决定。