.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
9 人のユーザが現在オンラインです。 (8 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 9

もっと...

.
.リンク集

メイン
   CakePHP モデル(Model)
     連続したsaveメソッドの使い方について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yando
投稿日時: 2008-2-12 8:42
一人前
登録日: 2006-8-7
居住地:
投稿: 99
連続したsaveメソッドの使い方について
連続したsaveメソッドの使い方についての投稿されたブログです。
連続してsaveメソッドを利用すると2件目以降がUPDATEになってしまう場合はmodelのcreateメソッドを呼びます。

http://ameblo.jp/glueck-06/entry-10072039795.html

idにNULLを代入する事でも同様の効果が得られたかと思います。
ken822
投稿日時: 2008-2-16 7:08
Baker ユーザ
登録日: 2008-1-29
居住地: クロアチア
投稿: 30
Re: 連続したsaveメソッドの使い方について
自分もバッチ処理の部分でこれに引っかかりました。
初心者が引っかかる部分ですよね
hide99
投稿日時: 2008-6-16 6:40
一人前
登録日: 2007-7-2
居住地:
投稿: 106
Re: 連続したsaveメソッドの使い方について
cakephp 1.2ですが、
create メソッドを使ったら

modified
created

が、正常に取得できずに 0000-00-00- のままになってしまいました。

なので
id に null を突っ込むのがいいかもしれませんね。

yando
投稿日時: 2008-6-16 9:17
一人前
登録日: 2006-8-7
居住地:
投稿: 99
Re: 連続したsaveメソッドの使い方について
コードを示してもらえれば誰かがバグ報告するかも・・・。

見たところ上がっていないようです。
https://trac.cakephp.org/search?q=create+save+created+&noquickjump=1&ticket=on
hide99
投稿日時: 2008-6-16 15:33
一人前
登録日: 2007-7-2
居住地:
投稿: 106
Re: 連続したsaveメソッドの使い方について
yandoさん、こんにちわ。

では、お言葉に甘えて。

cakephp1.2にて

× created.modified が 0000-00-00 になってしまう例。

<?php
$i 
0;
            while(
$i $config['repeat']){
                
$this->data $this->create();
                
$this->Datagenerator->set($this->data);
                
                if(
$this->Datagenerator->save()){
                    echo 
'正常に登録されました!<br />';
                    
pr($this->data);
                    
$this->Datagenerator->create();
                }
            
$i++;
            }
?>



○これなら正常に created , modified が登録される

<?php
$i 
0;
            while(
$i $config['repeat']){
                
$this->data $this->create();
                
$this->data['id'] = '';
                
$this->Datagenerator->set($this->data);
                
                if(
$this->Datagenerator->save()){
                    echo 
'正常に登録されました!<br />';
                    
pr($this->data);
                }
            
$i++;
            }
?>

yando
投稿日時: 2008-6-17 9:39
一人前
登録日: 2006-8-7
居住地:
投稿: 99
Re: 連続したsaveメソッドの使い方について
もうすこし詳細に書いたほうがよいように思ったんですが、とりあえず報告"だけ"しておきました。
なにかおかしいようであれば続報をお願いします。

https://trac.cakephp.org/ticket/4929
mogura
投稿日時: 2008-6-17 11:01
Baker スタート
登録日: 2008-6-17
居住地: 東京
投稿: 19
Re: 連続したsaveメソッドの使い方について
自分なりの解決法だと、saveの前に
$this->create(null);

$this->create(false);
を行うことで回避できました。あまり検証してないので間違ってるかもしれません・・・・

MASA-P
投稿日時: 2008-6-17 12:51
Cake 職人
登録日: 2008-1-24
居住地:
投稿: 224
Re: 連続したsaveメソッドの使い方について
ちょっと簡単にソースを見てみたんですが、Model:create()では、
$this->schemaから作りだしたデフォルト値と引数で与えたarrayを
データセットしているのですが、falseやnullではこの処理が省略
されているので、そこら辺がデフォルト($data = array())との
違いになっています(ちなみにβはこの部分は問答無用でやって
いて、RCで改変されています)。

つまり、デフォルト値の場合にこの書き換えが起きるため、それが
引き金になって日付が0になるっぽいです。何故0になるかは
デバッグしてみないと分からないのですが、不具合はこの辺に
ありそうです($this->schemaが壊れてる?)。

使われ方を考えると、Model:create()の$dataのデフォルト値は
null(false)の方がいいような気がしますね。
yando
投稿日時: 2008-6-17 14:46
一人前
登録日: 2006-8-7
居住地:
投稿: 99
Re: 連続したsaveメソッドの使い方について
https://trac.cakephp.org/ticket/4929

情報不足で閉じられてしまいました。

> there are tests in model.test.php that cover this. Please supply a diff against model.test.php to show the failing case.

model.test.php内のテストでは問題ないとの事なので、model.test.phpを改変する形で再現コードを出せればよいと思います。
確認お願いできますか?
yando
投稿日時: 2008-6-18 0:27
一人前
登録日: 2006-8-7
居住地:
投稿: 99
Re: 連続したsaveメソッドの使い方について
下記のテストケースは通りました。
単体の動きでみると大丈夫なようにも見えます。

hideさんのもともとのコード、よくみると一番最初にsaveが呼ばれる前にcreateが呼ばれていない気がしますが。
さてどうでしょうか?


<?php
function testCreationOfEmptyRecord() {
        
$this->loadFixtures('Author');
        
$TestModel =& new Author();
        
$this->assertEqual($TestModel->find('count'), 4);

        
$TestModel->deleteAll(truefalsefalse);
        
$this->assertEqual($TestModel->find('count'), 0);

        
$result $TestModel->save();
        
$this->assertTrue(isset($result['Author']['created']));
        
$this->assertTrue(isset($result['Author']['updated']));
////    this record is created right now.
//
        
$this->assertEqual(strtotime($result['Author']['created']),time());
        
$this->assertEqual(strtotime($result['Author']['updated']),time());
//
////
        
$this->assertEqual($TestModel->find('count'), 1);
    }
?>

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .