Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在两种不同的数据库类型之间执行伪关系查询?_Php_Sql_Database_Yii2_Nosql - Fatal编程技术网

Php 如何在两种不同的数据库类型之间执行伪关系查询?

Php 如何在两种不同的数据库类型之间执行伪关系查询?,php,sql,database,yii2,nosql,Php,Sql,Database,Yii2,Nosql,简言之,标题最好地描述了我的问题,但这里我展示了问题的核心 我的web应用程序中有两个数据库,一个是MariaDB,另一个是MongoDB,为了提供一些上下文,MariaDB中的“user”表用“id”列存储用户信息,这是主键,另一个“badge”表用“id”列存储徽章信息,这也是主键,最后是MongoDB中具有字段文档的“用户徽章”集合 {_id, user_id, badge_id, date} 这就是我所说的伪关系,不幸的是,我不知道在这种情况下它叫什么 例如: 我想查询并获取所有具有I

简言之,标题最好地描述了我的问题,但这里我展示了问题的核心

我的web应用程序中有两个数据库,一个是MariaDB,另一个是MongoDB,为了提供一些上下文,MariaDB中的“user”表用“id”列存储用户信息,这是主键,另一个“badge”表用“id”列存储徽章信息,这也是主键,最后是MongoDB中具有字段文档的“用户徽章”集合

{_id, user_id, badge_id, date}
这就是我所说的伪关系,不幸的是,我不知道在这种情况下它叫什么

例如: 我想查询并获取所有具有ID为1的徽章的用户。因此,我的伪查询应该执行类似的操作,如“从用户表中选择用户徽章集合中徽章ID为1的所有字段”。我在此处突出显示了类似的操作,因为这在查询中是不可能完成的(根据我的知识)无论如何,应该首先在MongoDB数据库上进行查询,然后在MariaDB数据库中针对前一个查询的结果进行第二次查询

编辑:我最初的问题是关于如何在Yii2 PHP框架中实现这一点,但当我搜索了一段时间后,发现即使在纯PHP中也没有这样做的信息,所以我决定在这里结束我编辑的问题,询问一种在sql数据库中的表和无sql数据库中的集合之间进行查询的方法下面我留下了我的老问题,它只是问如何在PHP框架中更具体地做到这一点。真的,如果我知道如何在纯PHP中做到这一点,我可以在框架中创建一个函数,如果没有的话

显然,两种数据库类型之间不可能有直接的primarykey-foriegnkey关系,但我通过在用户模型中使用::hasMany ActiveRecord方法解决了这个问题,这非常好;当我有一个用户模型时,我只需调用$Model->userBadges从MongoDB获取所有具有该用户ID的文档,反之亦然问题是,当我查询这个关系时,我得到了一个错误

调用未知方法:yii\mongodb\ActiveQuery::getTableNameAndAlias()

我申请的部分

用户模型中的UsergetUserBadges方法

扩展yii\mongodb\ActiveRecord的UserBadge模型

我的问题

$query = User::find()->joinWith(['userBadges']);
编辑:我发现前面的查询并不是我真正想要的,我将其简化为清晰的查询,但我想做的真正的查询,你会明白我为什么要做这些

$query = User::find()->joinWith(['userBadges'])->where(['badge_id' => 1]);
有了它,我可以从user中获取用户,这些用户拥有一个id为的特定徽章,例如1

在这里,代码失败并抛出上述错误

此方法允许您重用现有关系定义来执行联接查询。根据指定关系的定义,此方法将向当前查询追加一条或多条联接语句

在这里,我知道发生这种错误是正常的,在我的查询中,我加入了MongoDB数据库的集合中的文档,而不是SQL数据库中表中的记录,这肯定不起作用。我被困在这里,不知道该做什么,我坚持在SQL数据库中有用户表nd在无SQL数据库中有用户_badge集合,在这种情况下我该怎么办?先查询无SQL,然后根据前一个查询的结果查询SQL查询?或者ACITRequesty的方法已经解决了这样的问题?或者我的数据库结构无效


提前感谢。

因此,经过一段时间之后,我知道了如何在问句的帮助下进行查询,在问句中,对PHP数组进行SQL查询

因此,首先将查询MongoDB,结果将存储在一个数组中,然后将对前一个查询生成的数组进行MariaDB SQL查询,我很确定这不是最好的选择;如果MongoDB查询的结果为100000,该怎么办?一个数组将包含100000个条目,SQL查询将使用这是我能得到的最好的答案(直到现在)

如何在Yii2中实现它

// This line query from the MongoDB database and format the data returned well
$userBadges = UserBadge::find()->select(['user_id'])->where(['badge_id' => 1])->column();

// This line make the SQL query using the array generated from the former line
$userQuery = User::find()->where(['id' => $userBadges]);
我希望这个问题能有一个更好的答案,有人可以知道,但我想分享我到目前为止取得的成果

$query = User::find()->joinWith(['userBadges'])->where(['badge_id' => 1]);
// This line query from the MongoDB database and format the data returned well
$userBadges = UserBadge::find()->select(['user_id'])->where(['badge_id' => 1])->column();

// This line make the SQL query using the array generated from the former line
$userQuery = User::find()->where(['id' => $userBadges]);