Help us understand the problem. What is going on with this article?

CakePHP3 データベースの基本的な操作まとめ レコードを追加する・検索する

More than 1 year has passed since last update.

構築する前に

DBに、name,title,contentのフィールドが用意されているとする

レコードを追加する

src/Template/Boards/index.ctp
<h1>Database サンプル</h1>

<?=$this->Form->create($entity,['url'=>['action'=>'addRecord']])?>
<fieldset>
    <?=$this->Form->text("name")?>
    <?=$this->Form->text("title")?>
    <?=$this->Form->textarea("content")?>
</fieldset>
<?=$this->Form->button("送信")?>
<?=$this->Form->end()?>

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>NAME</th>
            <th>TITLE</th>
            <th>CONTENT</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach($data as $obj): ?>
        <tr>
            <td><?=$obj->id ?></td>
            <td><?=h($obj->name) ?></td>
            <td><?=h($obj->title) ?></td>
            <td><?=h($obj->content) ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
/src/Controller/BoardsController.php
<?php 
    namespace App\Controller;
    class BoardsController extends AppController {
        public function index() {
            $data = $this->Boards->find('all');
            $this->set('data',$data);
            $this->set('entity',$this->Boards->newEntity());
        }

        public function addRecord() {
            if($this->request->is('post')) {
                //エンティティクラスのインスタンスを作成。
                //newEntityは引数に指定されたデータを元にインスタンスを作成する
                //$this->request->dataはPOSTされたデータがまとめられているので、これを引数にする
                $board = $this->Boards->newEntity($this->request->data);
                //saveメソッドで作成したBoardインスタンスを保存し、データベーステーブルにレコードとして保存
                //newEntityはオブジェクトを作成しているだけなので、DBに何も影響しないので注意
                $this->Boards->save($board);
            }
            return $this->redirect(['action'=>'index']);
        }
    }

IDでレコードを検索する画面を作成する

src/Template/Boards/index.ctp
<h1>Database サンプル</h1>

<?=$this->Form->create($entity,['url'=>['action'=>'index']])?>
<fieldset>
    <?=$this->Form->text("id")?>
</fieldset>
<?=$this->Form->button("送信")?>
<?=$this->Form->end()?>

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>NAME</th>
            <th>TITLE</th>
            <th>CONTENT</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach($data as $obj): ?>
        <tr>
            <td><?=$obj->id ?></td>
            <td><?=h($obj->name) ?></td>
            <td><?=h($obj->title) ?></td>
            <td><?=h($obj->content) ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
<?php 
    namespace App\Controller;
    class BoardsController extends AppController {
        public function index(){
            $this->set('entity',$this->Boards->newEntity());
            if ($this->request->is('post')) {
             //findメソッドの第二引数に連想配列で検索に関する設定情報をまとめる
                $data = $this->Boards->find('all', [
                    'conditions'=>['id' => $this->request->data['id']]
                ]);
            } else {
                $data = $this->Boards->find('all');
            }
            $this->set('data',$data);
        }
      }

nameのあいまい検索をする

src/Template/Boards/index.ctp
<h1>Database サンプル</h1>

<?=$this->Form->create($entity,['url'=>['action'=>'index']])?>
<fieldset>
    <?=$this->Form->text("name")?>
</fieldset>
<?=$this->Form->button("送信")?>
<?=$this->Form->end()?>

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>NAME</th>
            <th>TITLE</th>
            <th>CONTENT</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach($data as $obj): ?>
        <tr>
            <td><?=$obj->id ?></td>
            <td><?=h($obj->name) ?></td>
            <td><?=h($obj->title) ?></td>
            <td><?=h($obj->content) ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
/src/Controller/BoardsController.php
<?php 
    namespace App\Controller;
    class BoardsController extends AppController {
        public function index(){
            $this->set('entity',$this->Boards->newEntity());
            if ($this->request->is('post')) {
                //findメソッドの第二引数に連想配列で検索に関する設定情報をまとめる
                $data = $this->Boards->find('all', [
                    'conditions'=>['name like' => "%{$this->request->data['name']}%"]
                ]);
            } else {
                $data = $this->Boards->find('all');
            }
            $this->set('data',$data);
        }

findの基本形

find('all',連想配列);

第一引数

第一引数 内容
'all' 全レコードを得る
'list' レコードのリストを得る
'threaded' スレッド状のレコードを得る

第二引数

オプションを設定するために用意するもの。
なければ、記述しなくて良い。
連想配列で記述する

//idのフィールドの値がdata['id']の等しいものだけ検索する
 $data = $this->Boards->find('all', [
                    'conditions'=>['id' => $this->request->data['id']]
                ]);
第二引数 内容
'conditions' 条件の設定。条件をつけるフィールド名をキーにした連想配列として用意する
'fields' 取得するフィールド名を配列として用意する
'recursive' 再帰的に取得する深度
'order' 取得順。順序を示す数字または名前を配列として用意する
'limit' 取得するレコード数
'offset' 取得開始位置のオフセット
'page' 取得するページ数
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした