Orm CakePHP-向查询对象添加自定义SQL
我正在使用CakePHP3.5.13构建一个包含4个独立数据库的应用程序 应用程序的主数据库(DatasourceOrm CakePHP-向查询对象添加自定义SQL,orm,cakephp-3.0,Orm,Cakephp 3.0,我正在使用CakePHP3.5.13构建一个包含4个独立数据库的应用程序 应用程序的主数据库(Datasourcedefault位于config/app.php中)已烘焙。它是一个遗留数据库,命名约定不是按照CakePHP指定的方式编写的。尽管如此,在浏览模型和编辑内容之后,它仍然有效 在控制器中,我具有以下功能: $substances = TableRegistry::get('Substances'); $query = $substances->find()->limit(
default
位于config/app.php
中)已烘焙。它是一个遗留数据库,命名约定不是按照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\u 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
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;
我需要对此进行修改,以便查询包含对存储在另一个数据库(Datasourcesdb5_tmpdata
inconfig/app.php
中)中的表的内部联接。我需要的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
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;
上述查询与原始查询的区别如下:
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf
ON tf.id = Substances.id
我没有表'searging_1745'
的对应模型,因为这些表是在保存“临时”用户数据的数据库上动态创建的(后来被删除)
是否可以修改查询对象,$query
,以便引入执行内部联接的自定义SQL
我尝试了添加('internaljoin'sdb5_tmpdata.'search_1745'作为tf ON tf.id=Substances.id')代码>但它不起作用 我不知道您是否可以修改查询对象,但您可以随时编写自己的自定义查询:
use Cake\Datasource\ConnectionManager;
$conn = ConnectionManager::get('default');
$query = $conn->query('query goes here');
有关更多信息,请阅读:查询生成器允许您根据需要构建查询。如果您没有该表的表对象,这并不重要
$query->join([
'tf ' => [
'table' => 'sdb5_tmpdata.searching_1745',
'type' => 'INNER',
'conditions' => 'tf.id = Substances.id',
]);
请参见我知道您可以编写自己的查询,但这不是我要问的。我想使用ORM生成一个查询,但随后通过引入我自己的SQL的一部分来修改该查询。如果你重读这个问题,你会发现所有的查询都可以通过ORM生成,这是使用内部连接的最后一位,需要编写为自定义SQL。所以它是ORM和自定义查询的组合。