

![topicsテーブル](https://i.stack.imgur.com/Z9IZg.jpg)![array画像](https://i.stack.imgur.com/Zk12a.jpg)![modifiedが正しく表示されない](https://i.stack.imgur.com/MgMny.jpg)

最近CakePHPの勉強を始めた者です。  
早速エラーに苦しめられています。。。。

初歩的な問題かと思いますので、  
どなたかお分かりの方、ご回答宜しくお願い致します。

# 【index.ctp】と【TopicsController】【Topic.php】のソースを記載します

## index.ctp

[code]

    <div class="topics index">
        <h2><?php echo __('Topics'); ?></h2>
        <table cellpadding="0" cellspacing="0">
        <thead>
        <tr>
                <th><?php echo $this->Paginator->sort('id'); ?></th>
                <th><?php echo $this->Paginator->sort('title'); ?></th>
                <th><?php echo $this->Paginator->sort('body'); ?></th>
                <th><?php echo $this->Paginator->sort('category_id'); ?></th>
                <th><?php echo $this->Paginator->sort('created'); ?></th>
                <th><?php echo $this->Paginator->sort(' modified'); ?></th>
                <th class="actions"><?php echo __('Actions'); ?></th>
        </tr>
        </thead>
        <tbody>
        <?php foreach ($topics as $topic): ?>
        <tr>
            <td><?php echo h($topic['Topic']['id']); ?>&nbsp;</td>
            <td><?php echo h($topic['Topic']['title']); ?>&nbsp;</td>
            <td><?php echo h($topic['Topic']['body']); ?>&nbsp;</td>
            <td>
                <?php echo $this->Html->link($topic['Category']['name'], array('controller' => 'categories', 'action' => 'view', $topic['Category']['id'])); ?>
            </td>
            <td><?php echo h($topic['Topic']['created']); ?>&nbsp;</td>
            <td><?php echo h($topic['Topic']['modified']); ?>&nbsp;</td>
            <td class="actions">
                <?php echo $this->Html->link(__('View'), array('action' => 'view', $topic['Topic']['id'])); ?>
                <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $topic['Topic']['id'])); ?>
                <?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $topic['Topic']['id']), array(), __('Are you sure you want to delete # %s?', $topic['Topic']['id'])); ?>
            </td>
        </tr>
    <?php endforeach; ?>
        </tbody>
        </table>
        <p>
        <?php
        echo $this->Paginator->counter(array(
        'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
        ));
        ?>    </p>
        <div class="paging">
        <?php
            echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
            echo $this->Paginator->numbers(array('separator' => ''));
            echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
        ?>
        </div>
    </div>
    <div class="actions">
        <h3><?php echo __('Actions'); ?></h3>
        <ul>
            <li><?php echo $this->Html->link(__('New Topic'), array('action' => 'add')); ?></li>
            <li><?php echo $this->Html->link(__('List Categories'), array('controller' => 'categories', 'action' => 'index')); ?> </li>
            <li><?php echo $this->Html->link(__('New Category'), array('controller' => 'categories', 'action' => 'add')); ?> </li>
            <li><?php echo $this->Html->link(__('List Comments'), array('controller' => 'comments', 'action' => 'index')); ?> </li>
            <li><?php echo $this->Html->link(__('New Comment'), array('controller' => 'comments', 'action' => 'add')); ?> </li>
        </ul>
    </div>
    
[/code]

## TopicsController

[code]

    <?php
    App::uses('AppController', 'Controller');
    /**
     * Topics Controller
     *
     * @property Topic $Topic
     * @property PaginatorComponent $Paginator
     */
    class TopicsController extends AppController {
    
    /**
     * Components
     *
     * @var array
     */
        public $components = array('Paginator');
    
    /**
     * index method
     *
     * @return void
     */
        public function index() {
            $this->Topic->recursive = 0;
            $this->set('topics', $this->Paginator->paginate());
        }
    
    /**
     * view method
     *
     * @throws NotFoundException
     * @param string $id
     * @return void
     */
        public function view($id = null) {
            if (!$this->Topic->exists($id)) {
                throw new NotFoundException(__('Invalid topic'));
            }
            $options = array('conditions' => array('Topic.' . $this->Topic->primaryKey => $id));
            $this->set('topic', $this->Topic->find('first', $options));
        }
    
    /**
     * add method
     *
     * @return void
     */
        public function add() {
            if ($this->request->is('post')) {
                $this->Topic->create();
                if ($this->Topic->save($this->request->data)) {
                    $this->Session->setFlash(__('The topic has been saved.'));
                    return $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash(__('The topic could not be saved. Please, try again.'));
                }
            }
            $categories = $this->Topic->Category->find('list');
            $this->set(compact('categories'));
        }
    
    /**
     * edit method
     *
     * @throws NotFoundException
     * @param string $id
     * @return void
     */
        public function edit($id = null) {
            if (!$this->Topic->exists($id)) {
                throw new NotFoundException(__('Invalid topic'));
            }
            if ($this->request->is(array('post', 'put'))) {
                if ($this->Topic->save($this->request->data)) {
                    $this->Session->setFlash(__('The topic has been saved.'));
                    return $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash(__('The topic could not be saved. Please, try again.'));
                }
            } else {
                $options = array('conditions' => array('Topic.' . $this->Topic->primaryKey => $id));
                $this->request->data = $this->Topic->find('first', $options);
            }
            $categories = $this->Topic->Category->find('list');
            $this->set(compact('categories'));
        }
    
    /**
     * delete method
     *
     * @throws NotFoundException
     * @param string $id
     * @return void
     */
        public function delete($id = null) {
            $this->Topic->id = $id;
            if (!$this->Topic->exists()) {
                throw new NotFoundException(__('Invalid topic'));
            }
            $this->request->allowMethod('post', 'delete');
            if ($this->Topic->delete()) {
                $this->Session->setFlash(__('The topic has been deleted.'));
            } else {
                $this->Session->setFlash(__('The topic could not be deleted. Please, try again.'));
            }
            return $this->redirect(array('action' => 'index'));
        }
    }
    
[/code]

## Topic.php

[code]

    <?php
    App::uses('AppModel', 'Model');
    /**
     * Topic Model
     *
     * @property Category $Category
     * @property Comment $Comment
     */
    class Topic extends AppModel {
    
    /**
     * Validation rules
     *
     * @var array
     */
        public $validate = array(
            'title' => array(
                'notEmpty' => array(
                    'rule' => array('notEmpty'),
                    //'message' => 'Your custom message here',
                    //'allowEmpty' => false,
                    //'required' => false,
                    //'last' => false, // Stop validation after this rule
                    //'on' => 'create', // Limit validation to 'create' or 'update' operations
                ),
            ),
            'body' => array(
                'notEmpty' => array(
                    'rule' => array('notEmpty'),
                    //'message' => 'Your custom message here',
                    //'allowEmpty' => false,
                    //'required' => false,
                    //'last' => false, // Stop validation after this rule
                    //'on' => 'create', // Limit validation to 'create' or 'update' operations
                ),
            ),
            'category_id' => array(
                'numeric' => array(
                    'rule' => array('numeric'),
                    //'message' => 'Your custom message here',
                    //'allowEmpty' => false,
                    //'required' => false,
                    //'last' => false, // Stop validation after this rule
                    //'on' => 'create', // Limit validation to 'create' or 'update' operations
                ),
            ),
            'modified' => array(
                'datetime' => array(
                    'rule' => array('datetime'),
                    //'message' => 'Your custom message here',
                    //'allowEmpty' => false,
                    //'required' => false,
                    //'last' => false, // Stop validation after this rule
                    //'on' => 'create', // Limit validation to 'create' or 'update' operations
                ),
            ),
        );
    
        //The Associations below have been created with all possible keys, those that are not needed can be removed
    
    /**
     * belongsTo associations
     *
     * @var array
     */
        public $belongsTo = array(
            'Category' => array(
                'className' => 'Category',
                'foreignKey' => 'category_id',
                'conditions' => '',
                'fields' => '',
                'order' => ''
            )
        );
    
    /**
     * hasMany associations
     *
     * @var array
     */
        public $hasMany = array(
            'Comment' => array(
                'className' => 'Comment',
                'foreignKey' => 'topic_id',
                'dependent' => false,
                'conditions' => '',
                'fields' => '',
                'order' => '',
                'limit' => '',
                'offset' => '',
                'exclusive' => '',
                'finderQuery' => '',
                'counterQuery' => ''
            )
        );
    
    }
    
[/code]


CC BY-SA 3.0
2015-02-08T07:01:18.810
6139
2015-09-07T09:13:46.177
2015-02-08T14:27:10.640
7176
7176
question
php mysql cakephp
CakePHPにてmodifiedが正しく表示されません。


この回答は[コメント](https://ja.stackoverflow.com/questions/6139/cakephp%E3%81%AB%E3%81%A6modified%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93#comment4982_6139)の説明を具体的にしたものです。  
ただし、@Daiki Yamada さんは既にキャッシュファイルを削除しており、症状が解決できていないので下記対策では解決できなかったようです。  
コメントだと分かり辛くなってしまいましたので、回答として記載します。  
もし `App/Config/core.php` 等で設定を独自に変更している場合は当てはまらない場合がございます。

# 1.CakePHP で扱う DB や Table の情報はキャッシュされています

[App/Config/core.php：$engine](https://github.com/cakephp/cakephp/blob/2.6.1/app/Config/core.php#L353)  
[App/Config/core.php：$duration](https://github.com/cakephp/cakephp/blob/2.6.1/app/Config/core.php#L358)

`$engine` が 'File' の場合、`App/tmp/cache/models/` 以下に DB の情報が保存されます。

@Daiki Yamada さんの状態だと、以下のようになっていると思います。

  * myapp_cake_model_default_samples_myfriends_categories
  * myapp_cake_model_default_samples_myfriends_comments
  * myapp_cake_model_default_samples_myfriends_list
  * myapp_cake_model_default_samples_myfriends_topics

`*_list` のファイルは `samples_myfriends` データベースに格納されたテーブルのリストが記されています。

`*_(db名)` のファイルは、各テーブルの情報が格納されています。

# 2.キャッシュファイルと実際のテーブルが違う場合の症状

例えば `modified` カラムを途中で追加した場合、キャッシュにはまだ `modified`
カラムが存在しない状態のテーブルがキャッシュされています。  
キャッシュが更新されるまでの間に `modified` カラムに関する処理を記述します。  
`modified`
が存在することを前提としたコードがモデルやコントローラに実装されると上記のキャッシュからテーブル情報を取得して不整合が起こり、`modified` が DB
のテーブルに存在しないような振る舞いをすることがあります。

# 3. 症状の解決策

  1. `App/tmp/cache/models` 以下のファイルを削除する。
  2. `App/config/core.php` の `Configure::write(‘Cache.disable’, true);` のコメントを外す。

これで、ファイルキャッシュされなくなりますのでテーブル情報が反映されないということも起きなくなります。

// 言葉で説明すると難しいですね、頂いたコードを自分の環境で試したとこ(CentOS,CakePHP2.6.1,PHP5.6.4)
問題なく実行できました。  
// 本当にどうしようもなくなってしまった場合は、一度環境を構築しなおすのも手かもしれません。


CC BY-SA 3.0
2015-02-09T04:29:36.407
6174
2015-02-09T04:29:36.407
2017-04-13T12:52:39.113
-1
7926
6139
answer