2015-06-04 68 views
0

我使用Yii 2.1和Yii2-elasticsearch 2.0.3与elasticsearch 1.5.0服务器一起尝试索引成员模型以进行更强大的搜索。我有一个common\indexes\Member模型,扩展yii\elasticsearch\ActiveRecord并设置我想索引的属性。Yii2 elasticsearch setAttributes()不工作

namespace common\indexes; 

use yii\elasticsearch\ActiveRecord; 

class Member extends ActiveRecord { 

    /** 
    * @return array the list of attributes for this record 
    */ 
    public function attributes() { 
     // path mapping for '_id' is setup to field 'id' 
     return ['id', 'given_name', 'family_name', 'email']; 
    } 
} 

我无法在common\indexes\Member模型设置我想要的属性。

我正在创建对象的新实例,并尝试通过ActiveRecord setAttributes()方法设置属性值,但似乎没有设置任何值。

$index = new common\indexes\Member(); 
$index->setAttributes(['given_name' => 'Test', 'family_name' => 'User', 'email' => '[email protected]']); 
$index->save(); 

这似乎创建一个空记录。如果我手动逐个设置属性,一切似乎都奏效,并且在elasticsearch数据库中创建了具有正确属性的记录。

$index = new common\indexes\Member(); 
$index->given_name = 'Test'; 
$index->family_name = 'User'; 
$index->email = '[email protected]'; 
$index->save(); 

我使用的setAttributes()方法不正确地为elasticsearch的ActiveRecord的?我是否需要以不同的方式设置我的elasticsearch模型?

+0

它是你的代码中的错字,你实际上从'AbstractIndex'而不是'elasticsearch \ ActiveRecord'定义为您声称? – Blizz

+0

是的,这是一个错字。 –

回答

4

默认情况下,setAttributes仅设置至少具有单个验证规则定义的属性或那些至少定义为“安全”(通过safeAttributes()或通过安全验证程序)的属性。

您可以强制它通过只是改变了呼叫分配一切

$index->setAttributes([ 
    'given_name' => 'Test', 
    'family_name' => 'User', 
    'email' => '[email protected]' 
], false); 

这就告诉它,它是好的,也赋予非安全属性。 但我通常更喜欢确保the validation配置正确

+0

同时添加了规则()方法和安全属性。 public function rules(){return [[['email','given_name','family_name'],'safe']];} –

+0

这将是正确的做法。现在你有了验证规则,也许可以让它们成为它们真正应该的呢?即,如果他们是必需的:使用''所需的''(所有'Validators'暗示'安全')。 – Blizz