【问题标题】:Can't populate doctrine embedded document in Elastica无法在 Elastica 中填充学说嵌入文档
【发布时间】:2014-01-24 20:13:22
【问题描述】:

当我运行此命令时,我的 Doctrine ODM 文档中有一个嵌入文档

 php app/console fos:elastica:populate

我收到此错误:

在线/usr/share/nginx/www/project/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/Transformer/ModelToElasticaAutoTransformer.php中的ng\myBundle\Document\Coordinates类的对象无法转换为字符串139

似乎是什么问题,警官?

从 137 到 141 的代码:

if ($v instanceof \DateTime) {
                $v = $v->format('c');
            } elseif (!is_scalar($v) && !is_null($v)) {
                $v = (string)$v;
            }

我的映射:

 mappings:
                        title: { boost: 5 }
                        coordinates: {type:geo_point,lat_lon:true, boost: 5 }

【问题讨论】:

  • 请在ModelToElasticaAutoTransformer.php的137-141行显示您的代码
  • 我更新了我的问题
  • 当我说它的类型是 geo_point 时,我不知道它为什么要尝试将其转换为字符串 ..
  • 您将$v 对象转换为标量string 类型。如果你想让它起作用,你必须在你的 $v 对象类中添加 __toString() 魔法方法

标签: symfony doctrine-orm elastica


【解决方案1】:

尝试在没有string转换的情况下使用此代码:

        if ($v instanceof \DateTime) {
            $v = $v->format('c');
        } elseif (!is_scalar($v) && !is_null($v)) {
            //$v = (string)$v // if you want that it work, add `__toString()` magic method in `$v` object class
            var_dump($v); // or try to dump var and find to method that you need to call
        }

【讨论】:

  • 但是它不会猜测字段的类型,这对我来说没关系,因为所有字段都是键入的,我会尝试一下,看看会发生什么
  • 它会起作用,但搜索会起作用吗?这就是我现在要验证的内容:)
  • 使用var_dump,您必须转储$v var 并找到需要调用的任何公共方法,以便将$v 对象转换为stringscalar 值。然后通过调用此方法替换 var_dump,如:$v = (string)$v->callAnyToStringOrToScalarMethod();
  • 但这不会影响我的搜索,我想我只需要在映射中声明geo_point ..但它似乎更复杂无论如何,我现在通过测试,我会返回结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2021-07-26
  • 2012-07-05
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
相关资源
最近更新 更多