CakePHP Model操作

bake

ソース生成

DB設定は「CakePHP インストール・設定/DB」参照

cd C:\xampp\htdocs\cakephptest
bin\cake bake all tests

→Bake All complete
と表示されるとOK

生成結果一覧


└src
 └Application.php
 └Console
  └Installer.php
 └Controller
  └AppController.php
  └ErrorController.php
  └PagesController.php
  └TestsController.php
  └Component
   └empty
 └Model
  └Behavior
   └empty
  └Entity
   └Test.php
  └Table
   └TestsTable.php
 └Shell
  └ConsoleShell.php
 └Template
  └Element
   └Flash
    └default.ctp
    └error.ctp
    └success.ctp
  └Email
   └html
    └default.ctp
   └text
    └default.ctp
  └Error
   └error400.ctp
   └error500.ctp
  └Layout
   └ajax.ctp
   └default.ctp
   └error.ctp
   └rss
    └default.ctp
   └Email
    └html
     └default.ctp
    └text
     └default.ctp
  └Pages
   └home.ctp
  └Tests
   └add.ctp
   └edit.ctp
   └index.ctp
   └view.ctp
  └View
   └AjaxView.php
   └AppView.php
   └Helper
    └empty

TestsTable.php

<?php
namespace App\Model\Table;

use Cake\Validation\Validator;

class TestsTable extends Table
{
  public function initialize(array $config)
  {
    parent::initialize($config);

    $this->setTable('tests');
    $this->setDisplayField('Col1');
    $this->setPrimaryKey('Col1');
  }
  public function validationDefault(Validator $validator)
  {
    $validator
      ->integer('Col1')
      ->allowEmpty('Col1', 'create');
    ~
    $validator
      ->dateTime('Col4')
      ->requirePresence('Col4', 'create')
      ->notEmpty('Col4');
    return $validator;
  }
}

Test.php

<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;

class Test extends Entity
{
  protected $_accessible = [
    'Col2' => true,
    'Col3' => true,
    'Col4' => true
  ];
}

TestsController.php

<?php
namespace App\Controller;

use App\Controller\AppController;

class TestsController extends AppController
{
  public function index()
  {
    ~
  }

  public function view($id = null)
  {
    ~
  }

  public function add()
  {
    ~
  }

  public function edit($id = null)
  {
    $test = $this->Tests->get($id, [
      'contain' => []
    ]);
    if ($this->request->is(['patch', 'post', 'put'])) {
      $test = $this->Tests->patchEntity($test, $this->request->getData());
      if ($this->Tests->save($test)) {
        $this->Flash->success(__('The test has been saved.'));

        return $this->redirect(['action' => 'index']);
      }
      $this->Flash->error(__('The test could not be saved. Please, try again.'));
    }
    $this->set(compact('test'));
  }

  public function delete($id = null)
  {
    ~
  }
}

edit.ctp

<nav class="large-3 medium-4 columns" id="actions-sidebar">
  <ul class="side-nav">
    <li class="heading"><?= __('Actions') ?></li>
    <li><?= $this->Form->postLink(
        __('Delete'),
        ['action' => 'delete', $test->Col1],
        ['confirm' => __('Are you sure you want to delete # {0}?', $test->Col1)]
      )
    ?></li>
    <li><?= $this->Html->link(__('List Tests'), ['action' => 'index']) ?></li>
  </ul>
</nav>
<div class="tests form large-9 medium-8 columns content">
  <?= $this->Form->create($test) ?>
  <fieldset>
    <legend><?= __('Edit Test') ?></legend>
    <?php
      echo $this->Form->control('Col2');
      echo $this->Form->control('Col3');
      echo $this->Form->control('Col4');
    ?>
  </fieldset>
  <?= $this->Form->button(__('Submit')) ?>
  <?= $this->Form->end() ?>
</div>

表示

http://localhost:8080/cakephptest/tests/

CRUD

プログラム言語 データベース操作」参照

別モデル参照

<?php
namespace App\Controller;

use Cake\Controller\Controller;
use Cake\ORM\TableRegistry;

class HelloController extends Controller
{
 public function initialize()
 {
  $this->Tests = TableRegistry::get('tests');
  $data = $this->paginate($this->Tests);
 }
}

バリデーション

class TestsTable extends Table
{
 public function validationDefault(Validator $validator)
 {
  $validator
   数値
   ->integer('col1')

   文字列
   ->scalar('col1')

   空値を許可
   ->allowEmpty('col1', 'create');

   空値を未許可
   ->notEmpty('col1');

   列がテーブルに存在する事
   ->requirePresence('col1', 'create')

   比較
   ->add('col1', 'comparison', ['rule' => ['comparison', '>', 10]])

   最大文字数
   ->maxLength('col1', 100)
   ->add('col1', 'length', ['rule' => ['minLength', 10]])

   最小文字数
   ->minLength('col1', 100)
   ->lengthBetween('col', [4, 8])
 }
}

コメントを残す

メールアドレスが公開されることはありません。