.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

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

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

もっと...

.
.リンク集

メイン
   CakePHP モデル(Model)
     hasOneとbelongsTo後のsave
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
KERBEROS
投稿日時: 2007-10-22 22:35
Baker 常連
登録日: 2007-9-25
居住地:
投稿: 59
hasOneとbelongsTo後のsave
v1.1についての質問です。
二つのモデルをhasOneとbelongsToでアソシエーションを設定しただけでsaveは一発で行えるのでしょうか。
viewにおいてはアソシエーションを組めているはずなのですが、saveが行えません。

viewでアソシエーションが動作しているという事は、saveを親となるモデルで行えば保存できるという認識で正しいのでしょうか。(ひとまずこの前提だけでもご助言頂ければ助かります。)
現在複数テーブルにまたがるsaveが出来ず困っています。
下記のソースでセーブしたところpostsテーブルは編集できていますが、theatersテーブルは変化がありません。


下記はマニュアルのブログチュートリアルをアソシエートのマニュアル部分を見ながらいじったものです。

app/models/post.php

<?php
class Post extends AppModel
        
{
                var 
$name 'Post';
                var 
$hasOne = array('Theater' =>
                                        array(
'className' => 'Theater',
                                                
'conditions' => '',
                                                
'order' => '',
                                                
'dependent' => false,
                                                
'foreignKey' => 'post_id'
                                        
)
                                );
        }
?>



app/models/theater.php

<?php
class Theater extends AppModel
{
    var 
$name 'Theater';
    var 
$belongsTo = array('Post' =>
                           array(
'className' => 'Post',
                                 
'conditions' => '',
                                 
'order' => '',
                                 
'foreignKey' => 'id'
                           
)
                     );

}
?>



app/controllers/posts_controller.php

<?php
class PostsController extends AppController
        
{
                var 
$name 'Posts';

                function 
edit($id null)
                {
                        if (empty(
$this->data))
                        {
                                
$this->Post->id $id;
                                
$this->data $this->Post->read();
                        }
                        else
                        {
                                if (
$this->Post->save($this->data)){
                                                
$this->flash('投稿を更新しました。','/posts');
                                        }
                        }
                }
        }
?>



app/views/posts/edit.thtml

<h1>投稿の編集</h1>
<form method="post" action="<?php echo $html->url('/posts/edit')?>">
    <?php echo $html->hidden('Post/id'); ?>
    <p>
        タイトル:
        <?php echo $html->input('Post/title', array('size' => '40'))?>
        <?php echo $html->tagErrorMsg('Post/title', 'タイトルは必ず入力してください。') ?>
    </p>
    <p>
        本文:
        <?php echo $html->textarea('Post/body', array('rows'=>'10')) ?>
        <?php echo $html->tagErrorMsg('Post/body', '本文は必ず入力してください。') ?>
    </p>

    <p>
        映画館名:
        <?php echo $html->input('Theater/thNAME', array('size' => '40'))?>
        <?php echo $html->tagErrorMsg('Post/thNAME', '映画館名は必ず入力してください。') ?>
    </p>

    <p>
        <?php echo $html->submit('保存') ?>
    </p>
</form>


theatersテーブル

CREATE TABLE `theaters` (
  `post_id` int(10) unsigned NOT NULL auto_increment,
  `thNAME` varchar(50) NOT NULL default '',
  `area` varchar(20) NOT NULL default '',
  `ken` varchar(20) NOT NULL default '',
  `address` varchar(200) NOT NULL default '',
  `tel` varchar(25) NOT NULL default '',
  `id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`post_id`)
)


postsテーブル

CREATE TABLE `posts` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `title` varchar(50) default NULL,
  `body` text,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  `rank` int(10) unsigned default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `rank_unique` (`rank`)
)
shun
投稿日時: 2007-10-23 10:15
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
Re: hasOneとbelongsTo後のsave
まずは、app/config/core.phpのDEBUGの値を2にして、どんなSQLができているかを確認するのはどうでしょうか。あと、

<?php
$this
->Post->save($this->data))
?>


というのは、$this->data から該当するデータを参照しつつ、「Postテーブルに」書き込む、という命令です。

Theaterテーブルにも書き込みたいのであれば、

<?php
$this
->Theater->save($this->data)
?>


も追加する、というのではどうでしょうか。'Post/thNAME'の設定も変更必要?
KERBEROS
投稿日時: 2007-10-23 15:57
Baker 常連
登録日: 2007-9-25
居住地:
投稿: 59
Re: hasOneとbelongsTo後のsave
お返事頂きありがとうございます。
無事解決いたしました。

SQLの表示については知りませんでしたので、非常に問題解決に役立ちました。
アソシエーションしたからといって連動して保存してくれるわけではないのですね・・。
マニュアルの アソシエーションの項に
引用:
hasOne, belongsTo, hasMany で関連付けられているモデルを保存するのは非常に簡単です。関連するモデルの ID と、外部キーのフィールドを設定するだけです。そのあとモデルの save() メソッドを呼べば、つながっているすべてのものが正しく組み立てられます。

とあったので少し勘違いしておりました。
適切にというのは今回の設定をしてという事なのですね、恐らく。

具体的には下記の通りです。
app/controllers/posts_controller.php

<?php
class PostsController extends AppController
        
{
                var 
$name 'Posts';
                var 
$uses = array('Post','Theater');//新規に追加

                
function edit($id null)
                {
                        if (empty(
$this->data))
                        {
                                
$this->Post->id $id;
                                
$this->data $this->Post->read();
                        }
                        else
                        {
                                if (
$this->Post->save($this->data)){
                                        if(
$this->data['Theater']['post_id'] == '' && $this->data['Theater']['id'] == ''){ //新規追加の場合にTrue
                                                
$this->data['Theater']['post_id'] = $this->Post->getLastInsertId(); //二行上のPostのidを取得
                                                
$this->data['Theater']['id'] = $this->Post->getLastInsertId();
                                        }

                                        if (
$this->Theater->save($this->data['Theater'])){
                                                
$this->flash('投稿を更新しました。','/posts');
                                        }
                                }

                        }
                }
        }
?>



副作用としてブログチュートリアルで設定したviewアクションで表示出来なくなったので、read()からfindById()に変更しました。

ご助言頂きありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .