4

yiimongodbsuite で upsert コマンドを実行する必要があります。私は試した

$model   = new Murls();          
                $model->userid=$userid;
                $model->title=$title;      
                $model->edits[0] = new Medithtml();
                $model->edits[0]->path= $htm;
                $model->edits[0]->html=$path;
                $model->edits[0]->ci=$ci;
                $model->update(array('_id'=>$rec->_id ),array('userid', 'title','edits' ), true );

しかし、これはエラーを示しています。

Murls モデルは次のように定義されます。

   class Murls extends EMongoDocument
    {
        public $userid;
        public $title;
        public $edits;



   public static function model($className=__CLASS__)
      {
        return parent::model($className);
      }

      // This method is required!
      public function getCollectionName()
      {
        return 'murls';
      }

      public function attributeLabels()
      {
        return array(
          'html'=>'Html',
        );
      }

      public function embeddedDocuments()
      {
        return array(
                // property name => embedded document class name
                'edits'=>'Medithtml',

        );
      }

      public function behaviors(){
            return array(
                            'embeddedArrays' => array(
                                'class' => 'ext.YiiMongoDbSuite.extra.EEmbeddedArraysBehavior',
                                'arrayPropertyName' => 'edits', // name of property, that will be used as an array
                                'arrayDocClassName' => 'Medithtml'    // class name of embedded documents in array
                ),
        );
      }

    }

Medithtmlを次のようにモデル化します

class Medithtml extends EMongoEmbeddedDocument{
    public $html;
    public $path;
    public $ci;

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }


}

私が達成する必要があるのは、 のレコード$titleが n 個の$html$pathおよびを持つことができるということ$ciです。どんな助けでも大歓迎です。私が探しているのは、このようなデータを保存することです

     array (
  '_id' => 
  MongoId::__set_state(array(
     '$id' => '51ee1956d39c2c7e078d80da',
  )),
  'userid' => '12',
  'title' => 'Mongo',
  'edits' => 
  array (
    0 => 
    array (
      'html' => 'html>body>div:nth-child(2)>a>div>a>div',
      'path' => 'ssssss',
      'ci' => '1',
    ),
    1 => 
    array (
      'html' => 'html>body>div:nth-child(2)>a>div:nth-child(3)>a>h2',
      'path' => '/assets/img/demo/demo-avatar9604.jpg',
      'ci' => '2',
    ),
    2 => 
    array (
      'html' => ' html>body>div:nth-child(2)>a>div:nth-child(3)>a>center:nth-child(16)>a>h1',
      'path' => '333',
      'ci' => '3',
    ),
  ),
)

'title'と の特定の組み合わせを持つレコードが存在する場合、コメント配列のみが更新されます。'userid'存在しない場合、新しいレコードが挿入されます。

4

2 に答える 2

3

間違ったクラスから継承しています。ドキュメントを保存するには、EMongoDocumentnotから継承する必要がありますEMongoEmbeddedDocument。これらのクラスは似ていますが、目的が異なります。

  • EMongoEmbeddedDocument埋め込みドキュメント専用です。埋め込みドキュメントにのみ使用する必要があります
  • EMongoDocumentからメソッドを拡張しEMongoEmbeddedDocumentて、実際にデータを db に保存します。

コメントの配列には、次の 2 つのオプションがあります。

  1. プレーンな php 配列を使用する - シンプルで保守性が低く、電力が少なく、エラーが発生しやすい..
  2. 埋め込みドキュメントの配列を使用- 各コメントはドキュメントであるため、検証可能で、厳密な構造などがあります。

デフォルトでは、 save/ insert/updateはすべての属性を保存します。$attributes部分的な更新の場合は、 とtrueを組み合わせて使用$modify​​します。警告: 属性の配列を指定せず$modifyに渡すと、渡された属性のみが保存され、残りのドキュメントは破棄されます。

public function save($runValidation = true, $attributes = null)
...
public function insert(array $attributes = null)
...
public function update(array $attributes = null, $modify = false)
...

したがって、あなたの場合、次のように更新できます。

$model->update(array('comments'), true);

または、ドキュメント全体を上書きしても問題ない場合は、次のように保存します。

$model->save();

注:複合 pk ovverride の場合primaryKey():

public function primaryKey()
{
    return array('title', 'userid');
}

ええと、スタックオーバーフローに下書きの自動保存機能があるのは良いことです:)

于 2013-07-22T16:20:08.737 に答える
1

最後に、この方法で解決策を得ました:

       $rec = $model->find($criteria)  ;
           if($rec){

       foreach($rec->edits as  $editarray){
            $var[]=$editarray;
       }
        $edits_new= new Medithtml();
        $edits_new['html']=$htm;
        $edits_new['ci']=$ci;
        $edits_new['path']=$path;  
        $var[]=$edits_new;
        $rec->edits=$var;

        $rec->userid=$userid;
        $rec->title=$title;
        $rec->update(array('edits'  ), true);
      }
于 2013-07-23T11:10:47.530 に答える