概括地说,标题最好地描述了我的问题,但在这里我展示了问题的核心。
我有两个数据库在我的web应用程序,一个是MariaDB,另一个是MongoDB,给一些上下文,"用户";表在MariaDB中,用户信息以列"id"这是主键,还有另一个"徽章"表它存储带有"id"列的徽章信息;这是主键,最后是user_badge;在MongoDB中有字段
的文档{_id, user_id, badge_id, date}
链接用户和他/她的徽章。这就是我所说的伪关系,不幸的是我不知道在这种情况下它叫什么。
一个例子:我想查询并获得所有的用户有一个标识ID 1。所以我的伪查询应该做一些像"选择user_badge collection中badge_id为1的用户表中的所有字段。我高亮了,就像在这里,因为这是不可能在查询中完成(根据我的知识),以某种方式,查询应该首先在MongoDB数据库上进行,然后在MariaDB数据库中对前查询的结果进行二次查询。
编辑:我原来的问题是关于如何实现这个在Yii2 PHP框架,但是当我用谷歌搜索了一段时间,我发现没有信息来做这种事即使在纯PHP,所以我决定结束我的编辑问题,寻求一种方式查询之间的sql数据库中的一个表和集合在一个无sql数据库,下面我把我的老问题这就要求怎么做更具体的PHP开发框架。如果我知道如何在纯PHP中做到这一点,我就可以在框架中创建一个函数来实现这一点,如果没有的话。
显然,两个数据库类型之间不能有直接的primarykey- foreign - key关系,但我通过在我的用户模型中使用::hasMany ActiveRecord方法来覆盖这个问题,并且工作得很好;当我在手上有一个用户模型时,我只是调用$model->userBadges从MongoDB获得所有具有该用户ID的文档,反之亦然。问题是当我做一个查询涉及到这个关系,我得到错误
调用未知方法:yiimongodbActiveQuery::getTableNameAndAlias()
应用程序的部分
<<p>用户strong> getUserBadges 方法Usermodelpublic function getUserBadges(){
return $this->hasMany(UserBadge::className(), ['user_id' => 'id']);
}
UserBadge模型扩展yiimongodbActiveRecord
class UserBadge extends ActiveRecord
{
public static function collectionName()
{
return 'user_badge';
}
public function attributes()
{
return ['_id', 'user_id', 'badge_id', 'date'];
}
public function getUser(){
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
public function getBadge(){
return $this->hasOne(Badge::className(), ['id' => 'badge_id']);
}
}
我查询
$query = User::find()->joinWith(['userBadges']);
编辑:我发现前面的查询并不是我真正想要的,我简化了它,让它更清晰但我真正想要的查询你们会明白我为什么要做这些的关键是
$query = User::find()->joinWith(['userBadges'])->where(['badge_id' => 1]);
然后我可以从user表中获取用户有一个id为的徽章,例如1。
这里代码失败并抛出上述错误。检查了一段时间后,我发现了joinWith方法的API
此方法允许您重用现有的关系定义来执行JOIN查询。根据指定关系的定义,该方法将向当前查询追加一个或多个JOIN语句。
在这里,我知道这个错误发生是正常的,在我的查询中,我加入了文档在collectionMongoDB的数据库,而不是在SQL数据库表中的记录,这绝对不会工作。我被困在这里,不知道该怎么做,我坚持在SQL数据库中有用户表,并在非SQL数据库中有user_badge集合,在这种情况下我该怎么做?先在no-SQL上查询,然后根据前一个查询的结果查询SQL查询?或者已经在activequery的方法中解决了这样的问题?或者我的数据库结构无效?
提前感谢。
所以经过一段时间后,我知道如何在这个问题的帮助下做到这一点,其中SQL查询是针对PHP数组的。
所以,首先MongoDB将被查询,结果将存储在一个数组中,然后一个MariaDB SQL查询将对从以前的查询生成的数组,我很确定,这不是最好的选择;如果MongoDB查询的结果是100,000呢?那么,一个包含100,000个条目的数组将被创建,SQL查询也将使用100,000个条目数组。然而,这是我能得到的最好的答案(到目前为止)。
如何在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]);
我希望这个问题能有一个更好的答案,但我想分享一下我到目前为止的心得。