CakePHP - 将自定义 SQL 添加到查询对象
CakePHP - add custom SQL to a Query object
我正在使用 CakePHP 3.5.13 构建一个具有 4 个独立数据库的应用程序。
应用程序的主数据库(config/app.php
中的数据源 default
)已烘焙。它是一个遗留数据库,命名约定不是按照 CakePHP 指定的方式编写的。尽管如此,在浏览模型并进行编辑之后,它仍然有效。
在控制器中我有以下内容:
$substances = TableRegistry::get('Substances');
$query = $substances->find()->limit(250)->offset(0);
$query->select(['id', 'app_id', 'name']);
$query->contain([
'Cas' => [
'sort' => ['Cas.id' => 'ASC']
]
]);
$query->contain([
'Ecs' => [
'sort' => ['Ecs.id' => 'ASC']
]
]);
如果我 var_dump($query)
我得到一个 SQL 字符串如下:
SELECT Substances.id AS `Substances__id`,
Substances.app_id AS `Substances__app_id`,
Substances.name AS `Substances__name`
FROM substances Substances LIMIT 250 OFFSET 0
我需要对此进行修改,以便查询包含 INNER JOIN
到 table 存储在 other 数据库之一(数据源 sdb5_tmpdata
在 config/app.php
中)。我需要的SQL如下:
SELECT Substances.id AS `Substances__id`,
Substances.app_id AS `Substances__app_id`,
Substances.name AS `Substances__name`,
Substances.date AS `Substances__date`
FROM substances Substances
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf
ON tf.id = Substances.id LIMIT 250 OFFSET 0;
上述查询与原来的区别如下SQL:
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf
ON tf.id = Substances.id
我没有 table 'searching_1745'
的相应模型,因为这些 table 是在包含 [=45= 的数据库上动态创建(然后删除)的] 用户数据。
是否可以修改查询对象 $query
,以便我可以引入执行 inner join
的自定义 SQL?
我试过$query = $query->newExpr()->add('INNER JOIN 'sdb5_tmpdata'.'searching_1745' AS tf ON tf.id = Substances.id');
,但没用。
我不知道您是否可以修改查询对象,但您始终可以编写自己的自定义查询:
use Cake\Datasource\ConnectionManager;
$conn = ConnectionManager::get('default');
$query = $conn->query('query goes here');
有关详细信息,请阅读:https://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries
查询构建器让您可以根据需要构建查询。如果您没有 Table 对象 table
也没关系
$query->join([
'tf ' => [
'table' => 'sdb5_tmpdata.searching_1745',
'type' => 'INNER',
'conditions' => 'tf.id = Substances.id',
]);
见here
我正在使用 CakePHP 3.5.13 构建一个具有 4 个独立数据库的应用程序。
应用程序的主数据库(config/app.php
中的数据源 default
)已烘焙。它是一个遗留数据库,命名约定不是按照 CakePHP 指定的方式编写的。尽管如此,在浏览模型并进行编辑之后,它仍然有效。
在控制器中我有以下内容:
$substances = TableRegistry::get('Substances');
$query = $substances->find()->limit(250)->offset(0);
$query->select(['id', 'app_id', 'name']);
$query->contain([
'Cas' => [
'sort' => ['Cas.id' => 'ASC']
]
]);
$query->contain([
'Ecs' => [
'sort' => ['Ecs.id' => 'ASC']
]
]);
如果我 var_dump($query)
我得到一个 SQL 字符串如下:
SELECT Substances.id AS `Substances__id`,
Substances.app_id AS `Substances__app_id`,
Substances.name AS `Substances__name`
FROM substances Substances LIMIT 250 OFFSET 0
我需要对此进行修改,以便查询包含 INNER JOIN
到 table 存储在 other 数据库之一(数据源 sdb5_tmpdata
在 config/app.php
中)。我需要的SQL如下:
SELECT Substances.id AS `Substances__id`,
Substances.app_id AS `Substances__app_id`,
Substances.name AS `Substances__name`,
Substances.date AS `Substances__date`
FROM substances Substances
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf
ON tf.id = Substances.id LIMIT 250 OFFSET 0;
上述查询与原来的区别如下SQL:
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf
ON tf.id = Substances.id
我没有 table 'searching_1745'
的相应模型,因为这些 table 是在包含 [=45= 的数据库上动态创建(然后删除)的] 用户数据。
是否可以修改查询对象 $query
,以便我可以引入执行 inner join
的自定义 SQL?
我试过$query = $query->newExpr()->add('INNER JOIN 'sdb5_tmpdata'.'searching_1745' AS tf ON tf.id = Substances.id');
,但没用。
我不知道您是否可以修改查询对象,但您始终可以编写自己的自定义查询:
use Cake\Datasource\ConnectionManager;
$conn = ConnectionManager::get('default');
$query = $conn->query('query goes here');
有关详细信息,请阅读:https://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries
查询构建器让您可以根据需要构建查询。如果您没有 Table 对象 table
也没关系$query->join([
'tf ' => [
'table' => 'sdb5_tmpdata.searching_1745',
'type' => 'INNER',
'conditions' => 'tf.id = Substances.id',
]);
见here