(゚д゚)こんばんわ、中の人デスヨ。


量的にも中途半端だったので分けてみた。(ぉ


むしろAAを自重しるといわれそうだがAAなくしてこのブログは成り立たないので却下。(なんというry


  _n
 ( l    ハ,,ハ
  \ \ ( ゚ω゚ ) +
   ヽ___ ̄ ̄  )   AA自重お断りします
     /    /

さてcodeigniterには便利なDBツールがある。

前までのくだりでわかったように、いちいちDBへ接続してupdateを掛けたりdeleteしたりせずとも、ツールを使うことでインサート、デリート、アップロードが自由にできるようになる。


そのツールこそ"scaffold"だ。(ようやく出てきた。つかCakePHPにもsymfonyでも使える様。


DBの利用目的としては「DBによる顧客情報の管理」から『フォーム部分での質問集』(たとえが滅茶苦茶デスガキニシナイ)、変化したりしなかったりと様々デスネ。


現に社内で使う為のツールにユーザー登録機能をつける意義はあんましないデスヨネー(社員が日雇いなら需要はあるかもですが…。)あんまなければ社員が入社or退社時に直接社員テーブルにインサート、デリート文を一回実行すればいいだけだし。


ということで話はそれましたが、DBには全部の機能を必要とする場合もあれば、データの閲覧だけできればいい場合もあります。で。scaffoldは、すべての機能をオールインワンで提供してくれる便利なツールです。

なので単純にデータを確認するだけ というならscaffoldを使用して確認すれば良く、また、その利用も簡単です。


つまるところDBの臨時の管理機能といったところでしょうか。


そんであ実際に使う為の操作を。


まずは設定ファイルを修正。


『aplication』フォルダ内の『config』フォルダを開き、その中から「routes.php」を見つけ出し編集しやう。

そして次の行を検索。


$route['scaffolding_trigger'] = "";


これがscaffoldを使う為のトリガーだ。

これを編集しよう。


$route['scaffolding_trigger'] = "myscaffold";

myscaffoldへ編集してみた。これでファイルを保存すれば準備おk。

この$route['scaffolding_trigger']="myscaffold";の値は、scaffoldの機能にアクセスするためのアドレス指定に使われるものです。例えば、Heloクラスで使うならば、helo/myscaffoldというアドレスにアクセスすると、scaffoldによるページにアクセスできるようになります。


続いてコントローラーの修正をしませう。

heloコントローラーのコンストラクタ(Heloメソッド)内に次の記述を追加しませう。


$this->load->scaffolding('blogs');

このscaffoldingメソッドは、引数に指定したテーブルにアクセスするためのscaffoldをロードする働きをします。

scaffoldを利用するための記述は以上で終わりです。


メソッドで思い出したけど、昔めそ…ゲフンゲフン!!

               ヽ l / /  r  ー  -- 、
                 __ヾWi"i,i'.        i
       /,. -ー ,,.;;;;;'::"´ ,.> ,-  /   ‐┬‐    |
       //  .,,;;';;;;:::: : :    ̄^ハiレ'.    ‐┼‐    |
     / /  /;;;:;( ̄ ̄ ヽ     |...    └‐   |
      i  '、  ;';;;;;;:::  ̄`'' "     __i     ‐┼‐   i
  i.  ':、  V;;;;;::::.. ,;;;;、      (  l      ‐┼‐   ',
  ヽ、    i;;;;;;;;;;;;::`'''゙       ヽ l.      -,    ;'
         l;;;;:;;;::::: :: :        ,;;;;、`|     ‐┴   .i
        l;:::::::: ::       `'''゙ l    ,―、   ;'
.        l:::::  ,ゝ-ヘ         〈      r"   / ノ ノ
        ';:::;/::::::;:、-゙ー'      l.      o   /
,. ‐- 、...,,_ ,,.;V:::::/ヾ::.      -=',_       /:;ヽ,
     ';;;:::::::::;':::/;:::::....   .. ..     ````"''ナ'::::::i:::::':、
::...    ;;;::::::::i:::/';`ヾ、::::::::::::::::::::::::::........ ,.. -'":::::::::::::l::::::::::':、
、::..    ,;;:::::;;ノ:/ ',::::::ヾ:``''''――::::'''''";;;;;;;;;;;:::ノ::::::::'::::::::::::::
..'、::.   --=';:::ノ  ',:::::::::\::::'ヾ::::::::::`` ̄ ̄::::::::;;;:::::::::::::::::::::
 ヾ;:;;:...::.  i;;"    ';:::::::::::::\::::ヾ、::::::::::::::::::::::::;;;;:::::::::::::::::::::::
  〉;;::.   i,      ';:::::';::::::::::ヾ:::::::'::::、:::::::::::::::::::::::::::::::::::::::::::


であ実際に使って見ませう。

とりあえずhttp://localhost/igniterapp/helo/myscaffold へアクセスヽ( ^ω^)ノ サクセス!



PHP2009-36
↑これが管理画面。


PHP2009-37
Editリンク押下時


PHP2009-38
編集実行後。


このように、scaffoldでは「一覧表示」「新規作成」「レコード更新」「削除」といった基本機能が全部搭載されています。便利。


テスト用にレコードを入れるというときにも使えます。まぁあくまでレコードのツールなんでXAMPPな人はDBとかテーブルは別途PHPMyAdminで作る必要があります。


使用後は$this->load->scaffolding('blogs');をコメントアウトすればOK。

ま、あくまで臨時のDB管理機能ということで。


次はモデルの説明に移りますYO

      ノ)
  ハ,,ハ_ / ノ
 ( ゚ω゚)' ./   セクシーにお断りします
 ( -、   ~⌒`つ


   。 。
  / / ポーン!
( Д )

  * *   * *
 * * * * * *
  * *    * *
      パーン!
( Д )


とりあえずモデルがなくともDBへの接続ができてしまうわけですが、あまりにいろいろなアクセス処理が必要になると、その都度いちいちアクセスのためのための処理を書いていてはアレすぎます。


なのでDB処理もまとめてしまい、使う毎に呼び出すようにすればイイのですぉ。


というわけでモデルの核心部分、というかモデルをちゃんと扱っていきますYO


DBにアクセスして必要な処理を行うメソッドをモデルクラスに用意しておき、それをコントローラーから使用するという方法で。


でぁモデルの作成からいきまっしょい


モデルは『application』フォルダの『models』フォルダの中に用意します。名前はblogs_model.phpで。


blogs_model.php

<?php

class Blogs_model extends Model{

function Blogs_model(){
parent::Model();

}
}
?>


これは…と思うかも知れませんがコントローラーの時と一緒です。ファイル名は全部小文字、ファイル名と同じで

頭文字のみ大文字のクラス名、クラス名と同じメソッドでコンストラクタ作成。手順はまったく同じ。


モデルクラスの場合はModelクラスを継承して作ります。ちなみに継承とかオブジェクト指向関連はJava関連書物か何かで解説されているっぽいので興味(もしくはシラネって人)ある人はネットなり書籍なりで調べていただければ。ちなみに中の人は概念はわかったがよく理解していない(要はわかっていないorz)。

フレームワーク勉強し始めてようやくちょいとわかってきた…のかな(´Д`;)とりあえず実際にモノ作らなきゃ理解できない概念の様ですorz


とりあえずモデルの基本ともいええうコンストラクタ部分は生成したので実際にメソッドを追記して機能を追加していきませう。

コントローラーのindexメソッドのほうで全レコードを取得する際に$db->getを用いますが、これをget_allrecordsというメソッドにまとめます。


モデルでまとめ用のメソッドget_allrecordsを追加します。


blogs_model.php

function get_allrecords()
{
$query = $this->db->get('blogs');
return $query->result_array();
}

全部のレコードを取得するメソッドの作成完了。

続いてコントローラーのほうのindexメソッドの修正にかかりませう。

『controllers』の「helo.php」に次のメソッドを編集(゚д゚)クワッ

(´Д`;)だいぶごちゃごちゃしてきたな…helo.phpでもまだ甘いか。


helo.php

function index(){
$data = array('head_title'=>'index','content'=>'index');
$data['records'] = $this->db->get('blogs')->result_array();
$this->load->view('layout/mylayout',$data);
}

これを

function index(){
$data = array('head_title'=>'index','content'=>'index');
$this->load->model('Blogs_model','blogs');
$data['records'] = $this->blogs->get_allrecords();
$this->load->view('layout/mylayout',$data);
}
へ書き換え。赤字部分がかわってますぇ。


コントローラーでのモデル使用は次の通り。

モデルのロード。


$this->load->model('モデルクラス','名前');


第一引数で使用するモデルクラス名、第二引数でこのコントローラーに用意するときの変数名を指定します。

例だとblogsという変数名。


実際に$this->blogs->allrecords()で、モデルのblogsクラスのallrecordsメソッドを呼んでいます。


これにより先に設定したモデルでの全クエリー取得が発動するわけです。


           , -─- 、  , -‐- 、
        ,, -'"     `V     `‐、
      /                 \
    ./                       \
    /                      ヽ
   ./  /                   l  ヽ
  /  / /  / ./ /          l   | .l .lヽ
  |  l. l  /  / / ./ .l    |  |  l  / /  l l.〉   ∧∧∧∧∧∧∧∧∧∧∧∧
   l、 | |  l  / / ./ ./   |.  l  | ./ ./ ./ | |./   <                 >
    l、| | l // ///|   l  / / //// / /   .< 罠カード発動!!!!  .>
    l、l | /l///_/ l  / //_|/_∠| / | /     .<                 >
    /⌒ヽ | \ `ー' ゝl  // `ー' /|/⌒v'     < ずっと全クエリ取得!   >
    | l⌒l l|    ̄ ̄"//|〉 ̄ ̄ ̄  .|/^_l.l       <                 >
    ヽゝ(ー| /|   ´ \|       ll ),l'ノ         ∨∨∨∨∨∨∨∨∨∨∨∨
     lヽ_ /  |   ┌───7   /._/
     .l/   |     l ̄ ̄ ̄/    / /   ,ノ!
    /       |..   V´ ̄∨   ./ /,.-‐'" .|
    ./   (;;)   |\   `ー‐'´  / /       |
    |     _|_\       /| ./      |
   (|   ,.-‐'"    | \__/  .|/    _,.-─;
   |/    .(;;) |─────┤ _,.-‐'":::::::::/
   ̄         |::::::::::::::::::::::::::::::|^l::::::::::::::::::/

ずっと俺のターン!!

表示できん!!とおもたら


function get_allrecords()
{
$query = $this->db->get('blogs');
return $query->result_array();
}

クラス内に入れ忘れてたorz(}の位置が…orz)

      `` ‐- 、l'          |  ||| |       l,:-‐'"
                       |. ||| .|
                 ,へ.     |. |||  |    ./゙l     ./
``‐ 、_       .iヽ  .l   \   |    |   /  .| /l/
、   ` ‐、    .|. \l    \  |     .| ./    |/  .|〃〃
. ゙ヽ、   `゙‐;l\|.  │      \|    .l/      .| ||| |〃./
\  ゙ヽ、  ミ l.  | ||| .| |||     ヽ.   /     ||| |. ||| .l/
  \   ゙ヽ、.l ||| | ||| .| |||  |ミヾ丶 ヽ /,,",- '"´| . ||| . l. ||| .l
    \,  `| ||| | ||| .| |||  |:: `゙`‐-、V〃" :::::::::l . ||| . l.   l
""´~ ̄   _| |||..|   ./.   │::          :::::l、   l.   l__   .∧∧∧∧∧∧∧∧∧∧
,,.: -‐''"´ ̄   ./  /   ./::          ::::::::l、  .|____ .<                >
  三三三  /  /   . ∠_::          ::::::::::::::l、         < 罰ゲーム!!      >
────/ヽ/   | ||| |ー-`ニ::、、_:::::::::::::::::::::::::::::_;;ニ-\____  <               >
゙ヽ、   //ヽ| ||| | ||| |、 ○ ノ  i`‐、::::::::::,:‐''/ !、○  ノ /::;l/‐゙iヽ < ──挿入位置ずれ──>
  ゙ヽ. l l/ゝ| ||| |...||| | `‐-‐'´   l::  :::  /   `ー-'" /::::l/ / l. ) <                >
.    \\ー,| ||| |.   `iヽ--──-  :::::::::::::::::ー─---一丶i‐-,"///<                >
.      \\|   | .   |::      ::::::::: |〉:::::::::::::: :::::::::::::::;l ),ノ/   <   Fatal error: !  >
、 ̄ ̄ ̄ ̄   |   |   |::                 :::::::;l-‐'´ ̄ ̄ <                 >
. `` ‐ 、      l   |.   |:       ,.-─‐-、      :::;l         ∨∨∨∨∨∨∨∨∨∨
     `` ‐、  l  ||   |        i' ̄ ̄ ゙̄i     ::::;!
        ゙ヽl.  |.l.  |、       l,.-─‐-、l     ./   .,. ‐'´
           l. |、!. | `‐:、      ヽ、_,,ノ   ,.‐"   , ‐'´
        .i--─l.│.l . |、. |`゙ ‐、       .,.‐´|  ,‐'"─‐--i
         | |   l | . l. | `‐,|.    ``ヽ、.__,. ‐'´  .|,/     | |
         .|(l   ∥ . l.|  l`‐- 、____ _,, -‐"!      |)|
         _| |   |  .l| (;)  | ____l´   (:)       | |
  ,ヘ,. -‐''"´ l |       |../l.   | !___    _,|`ヽ...   l |
''"´       .|(l.    ,:-‐(..(`゙‐ 、|____l_,, -‐"/‐l )-;.  |)|


GYAAAAAAAAAA!!!!!!!!!




PHP2009-39
とりあえず}の位置修正したら普通に表示されたorz

(´・ω・)これまでのDBアクセスは$dbにある専用のメソッドを使って結果を受け取るというものでした。


$dbには一通りの機能があるようですが、万能ではない。とのこと。

ぶっちゃけコードイグナイターの最低限の法則(勝手に名づけた(ぉぃ)に従って全部が全部あるわけじゃないから


自分が足りないと思ったらその都度足していけばいいわけで。

ということで実際に直でSQLクエリーを発行するぜ!という手順の解説?


とりあえず例として簡単な検索機能。陳腐とか言わないお約束。


  ∧ ガラッ ∧
 (.,,゚Д|゚д゚)っ|゚)<中の人などいない!

  ∧∧ピシャッ
 (.,,゚Д|゚)Σ

例によって『views』のindex.phpを変更。


index.php

<h1>Blog一覧</h1>
<p>テーブルの一覧です。</p>
<table>
<tr>
<th>ID</th>
<th>DATA</th>
<th>TITLE</th>

<th>CONTENT</th>
</tr>
<?php foreach ($records as $row): ?>
<?="<tr><td>{$row['id']}</td>" ?>
<?="<td>".date('Y/m/d'.$row['timestamp'])."</td>" ?>
<?="<td>{$row['title']}</td>" ?>
<?="<td>{$row['content']}</td></tr>" ?>
<?php endforeach; ?>
</table>

今の段階ではおそらくこうなっているかと。

それを↓のように修正。


赤字部分が変更部分。ちなみに☆ミキラッ は入れても入れなくてもおk。




findに送信されます。


PHP2009-40
こんな感じで検索窓が増加。

次に送られる先、findの作成に。


コントローラーにfindメソッドを作成しませう。

流れとしてはビューでリクエストを受け取り、コントローラーを解してモデルでデータを検索するという

流れにします。

コントローラーにfindメソッドを追加してからモデルに移りますぉ。


helo.php

function find(){
$data = array('head_title'=>'index','content'=>'index','records'=>array());
if($this->input->post('find') != null){
$find = $this->input->post('find');
$this->load->model('Blogs_model','blogs');
$data['records'] = $this->blogs->get_findrecords($find);
}
$this->load->view('layout/mylayout',$data);
}

フォームからpostされてくるfindが空ならnot発動。もしあれば$findにfindの値を入れる。

そしてお定まりのテーブルロックオン作業の後にクエリで引数($find)。このfindを検索する処理関数をモデルで

つくっちゃいますYO!!

次はモデル作成。『models』の「blogs_model.php」を修正しまつ。


blog_model.phpに次のようにget_findrecordsメソッドを追加。

function get_findrecords($str){
$sql = "SELECT * FROM blogs WHERE title like ? OR content like ?";
$query = $this->db->query($sql,array("%{$str}%","%{$str}%"));


return $query->result_array();
}

単純にやっていることは1つ。引数を基にしてセレクト文実行。

ってそれじゃ解説にならんのでもうちょい詳しく。

まず$strはご承知の通りコントローラーから飛んできたfindの値。


関数最初の部分はタイトル、コンテンツ内に条件の一部でも合致するもののサーチ。

?には秘密が。とりあえずLIKEはMYSQLのあいまい検索時も用いられるもの。って、おkだよね。

$queryはDBにクエリ投げる関数。queryはクエリ実行。


query('クエリ文',配列);


でsql文中の?が威力を発揮。


クエリ文の後に配列を渡してやればそれがそのまま?に入ります。つまりこの場合、フォーム(name=find)に(゚∀゚)

と入力されたら、実行されるSQL文は"SELECT * FROM blogs WHERE title like (゚∀゚) OR content luke (゚∀゚)"

に置き換わるわけです。

すげー。


つまりtitleとcontent内に(゚∀゚)を含むレコードが検索される、ということになります。

であ実際に確かめてみましょう。



PHP2009-41
(゚∀゚)と入力。もしコンテンツかタイトルに(゚∀゚)が含まれていれば表示される…はず。



PHP2009-42
(゚д゚)!!HITした模様です。


ちなみにデフォ状態では(未検索時)下のレコード欄は空です。

PHP2009-43
こんなん。


一覧見るにはhttp://localhost/igniterapp/helo/  へアクセスしなきゃいけないから困る。


まぁいいけど。


とりあえずモデル編(おまけ)はこれにて終了。


(゚ω゚)次回以降はバリデーションについて扱っていきますYO!!


( ゚ω゚)ノシ TO BE CONTINUED!!

人気ブログランキングへ