laravel-mongodb 拓展与 MySQL 关联问题

By on

当我们在存储mongo数据的时候,整型字段存储的值为NumberLong格式,那么如果这个id来自于MySQL,在使用MySQL模型与MongoDB关联查询时就会踩到这个坑,从jenssegers/laravel-mongodb生成的SQL可以看到类似这样的结果:

...{"object_id":{"$in":["13", "15"]}}...

可是我们的期望是:

...{"object_id":{"$in":[13, 15]}}...

这里的13、15是MySQL里的一条记录,在mongo里的值为NumberLong(13), 所以查询结果永远为空。 找遍了源码,没有一个更好的解决方法,后来只能使用Eloquent模型提供的属性修改器来实现:

MySQL的模型里对相应字段使用修改器(这里以id为例):

/**
 * 避免与mongo关联时id转为字符的问题
 *
 * @param string $id
 *
 * @return int
 */
public function getIdAttribute($id)
{
    return intval($id);
}

方法名:get属性名大驼峰Attribute, ex: object_id -> getObjectIdAttribute

框架源码参考:getAttribute

Updated