(゚д゚)ノ コンバンワ、中の人ですYO。
今回はモデルとテーブルについてやっていきますYO。
(´Д`;)しかし複数SNS利用しているとどこかが疎かに。ナンテコッタイorz
_,,:-ー''" ̄ ̄ ̄ `ヽ、
,r'" `ヽ.
__,,::r'7" ::. ヽ_
゙l | :: ゙) 7
| ヽ`l :: /ノ )
.| ヾミ,l _;;-==ェ;、 ,,,,,,,,,,,,,,,_ ヒ-彡|
〉"l,_l "-ー:ェェヮ;::) f';;_-ェェ-ニ ゙レr-{ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ヽ"::::''  ̄´.::;i, i `'' ̄ r';' } | 久々にワロタ
. ゙N l ::. ....:;イ;:' l 、 ,l,フ ノ | AA盛りだくさんで笑いを誘うのが
. |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ. /i l" < 昔のアメブロなんだよな今のアメブロ
.| ::゙l ::´~===' '===''` ,il" .|'". | は放置気味だから困る
.{ ::| 、 :: `::=====::" , il | \________
/ト、 :|. ゙l;: ,i' ,l' ノト、
/ .| \ゝ、゙l;: ,,/;;,ノ;r'" :| \
'" | `''-、`'ー--─'";;-'''" ,| \_
困る。
であどんどんいきましょー。
MVCの中の最期のモデル部分はいわずもがな…データベースの操作系統をひとまとめにする部位ですのよ。
操作系統がまとめられているので直接SQL文うちこんでクエリを送信したりせずにメソッドを呼び出すだけでDBの操作ができますぉ。
⊂二二二( ^ω^)二⊃
| / ブーン
( ヽノ
ノ>ノ
三 レレ
「たかがDBの操作まとめただけやん」とか言われそう。
(#^ω^)ビキビキ
( ^ω^)甘く見てはいけないぉ。フレームワークのモデルはDBソフトの垣根を越えることができるんだぉ。
( ^ω^)つまりシステムで使用しているデータベースがオラクルだろうがポスグレSQLだろうがMYSQLだろうが…全部同じ記述で、また、DBソフトを変えても命令系統を全部書き換える必要がないんだぉ。
( ^ω^)また、DBアクセスに使用されるSQL文をプログラムから完全に排除することが可能なんだぉ。
これによりプログラマはプログラムだけわかれば何の支障もなく作業に集中できるんだぉ。
(#^ω^)まぁ今の時代WEB系PGなのにSQLわからないPGなんてPGなんて呼ばないぉ。
さてモデルの内容に移行。
モデルはDB全体を操作できるわけではなく、個々のテーブルごとに利用する方式です。
つまりDB内のテーブル1つを単位としてモデルを構築していくわけです。
1テーブルで1モデル(ぇ
モデルを介してテーブルにアクセスするよ!!
∧,,∧
(;`・ω・) 。・゚・⌒) チャーハン作るよ!!
/ o━ヽニニフ))
しー-J
アッ! 。・゚・
∧,,∧ て 。・゚・。・゚・
(; ´゚ω゚)て //
/ o━ヽニニフ
しー-J 彡
∧,,∧ ショボーン
( ´・ω・)
c(,_U_U ・゚・。・ ゚・。・゚・ 。・゚・
━ヽニニフ
さてそれぞれのモデルはDB内の特定のテーブルに関連付けられます。
これをいめーじにするとこうなりますぉ。
グルグルグル 取っ手の取れる~
〃 三 .Λ,,Λ 三=≡,,Λ‐ ─
。・。・。 (ω・;≡・ω=;`・ω) =。・。
ヽニニフ━oc三 ─ ニフ 三 ニフ
゙ミ 三 =- 彡 〃
- ≡三彡
ティファール♪
〃 Λ,,Λ ミ ブン!! ガッ
( ´・ω・) -=≡ 。・。・。 そ_∧
/ oo━ -=≡ ヽニニフて`Д´)
\_, ( 、 > 彡' ( つ ノ
`) ヽ,_)′ ノ ノノ
⌒`
モデル作成にはつぎのものが必要です。
・DB鯖
・DB利用用設定ファイル
・テーブルの作成
まずDBですがPHP5に標準でついてくるSQLiteなるものをチョイス。
ぶっちゃけ何のDBソフトでもOKですぉ。
でぁSQLiteを使用するという前提で話をすすめるょ!!
XAMPP環境。
CakePHPには「bake」なる各種設定ファイル生成スクリプトが用意されているのでそれを使用して設定ファイルをつくるよ!
bakeを実行するには環境pathにPHP.exeとcakePHPの「console」フォルダへのパスの追加が必要。
「スタート」「コントロールパネル」「システム」→詳細設定タブ→「環境変数」→「システム環境変数(S)」→Path→編集(I)ボタン押下
→末尾に「;c:\xampp\php;C:\xampp\htdocs\cakeapp\cake\console」を追加。
追加後コマンドプロンプト起動
↓
cd C:\xampp\htdocs\cakeapp
cake bake
welcome to cakePHP v*.*.* Console
--------------------------------------
App:app
path: c:****/****/****/*****/app
-------------------------------------
Your database configuration was not found. Take a moment to create one.
------------------------------------
ごにょごにょ。
と表示されればおk。表示されない場合はphp.exeと「console」フォルダへのパスのいずれかor両方が間違っている可能性。
では以下bakeできていることを前提に説明。
Name:
[default]>
設定ファイル名の入力になります。デフォでいいのでエンター。
Driver:(***/***/**/**/****/)
[mysql]>
ドライバの指定。今回はSQliteなので「sqlite」と入力。
Persistent Connection?(y/n)
[n]>
永続的接続をするかどうか。使用しないのでエンター。
Database host:
[localhost]>
DBのホスト名を入力。デフォでローカルになっているのでこのままエンター。
Port?
[n]>
ポート設定。SQliteでは特に指定しないのでそのままエンター。
User:
[root]>
アクセスするユーザー名の指定。デフォでroot。指定する場合は入力。今回はそのままエンター。
Password:
>
パスワード。SQLiteでは必要ないので空エンター。「パスワードが空(゚Д゚#)ゴールァ!!」といわれますが「y」と入力しエンター。
Database Name:
[cake]>
データベース名です。デフォでは「cake」。今回はC:\sqlite_data\cake.sqliteというDBファイルを用意しようと思うので「C:\sqlite_data\cake.sqlite」とパスを入力します。
Table Prefix?
[n}>
プリフィクスの指定です。特に指定しないので、そのままエンター。
Table encodeing?
[n]>
テーブルのエンコーディング指定。
「utf8」と入力してエンター。
最後に設定内容が全部表示されます。
おkならそのままエンター。修正なら「n」でエンター。
Look okey?(y/n)
[y]>
エンター。
Do you wish to add another database configration?
[n}>
他のDBを作成するか?エンターで終了。
これでDBの設定ファイルが作成されました。
であ設定ファイルを確認してみませう。
「app」内の「config」内にあるぽ。
C:\xampp\htdocs\cakeapp\app\config。
でぁ作成された設定ファイル「database.php」を開いてみませう。
<?php
class DATABASE_CONFIG {
var $default = array(
'driver' => 'sqlite',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'C:\sqlite_data\cake.sqlite',
'encoding' => 'utf8'
);
}
?>
タブン↑のようになっていると思われ。
DBの設定はDATABASE_CONFIGというクラスとして定義されています。
ここに$defaultというメンバー変数を用意し、そのなかに各項目の値を連想配列として収めているのです。
それぞれの内容は先ほどbakeで入力したものと同じですYO。
もしDBに関する変更などあればこれを編集して対応しませう。
DB作成:
DBを作成します。今回はC:\sqlite_data\cake.sqliteを指定したので『sqlite_data』フォルダを作成しますぉ。
フォルダ内に「cake.sqlite」というファイルを作成、「スタート」→「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」を開き、つぎのように入力。
C:\xampp\apache\bin\sqlite C:\sqlite_data\cake.sqlite
ではテーブルを作成しますYO
create table blogs(
id integer not null primary key,
timestamp integer,
title varchar(255),
content text
);
でテーブル作成。作成すると空ファイルだったcake.sqliteが3KBになるぉ!
(゚ω゚)テーブル分増加したんですね、わかります。
-― ̄ ̄ ` ―-- _
, ´ ......... . . , ~  ̄" ー _ ブッブー
_/...........::::::::::::::::: : : :/ ,r:::::::::::.:::::::::.:: :::.........` 、 ブーン
, ´ : ::::::::::::::::::::::::::::::::::::/ /:::::::::::::: : ,ヘ ::::::::::::::::::::::: : ヽ キキー
,/:::;;;;;;;| : ::::::::::::::::::::::::::::::/ /::::::::::::::::::: ● ::::::::::::::::: : : :,/
と,-‐ ´ ̄: ::::::::::::::::::::::::::::::/ /:::::::::::r(:::::::::`'::::::::::::::::::::::く
(´__ : : :;;:::::::::::::::::::::::::::/ /:::::::::::`(::::::::: ,ヘ:::::::::::::::::::::: ヽ
 ̄ ̄`ヾ_::::::::::::::::::::::し ::::::::::::::::::::::: :●::::::::::::::::::::::: : : :_>
,_ \:::::_| ̄ ̄ |_::::::::::::::: `' __:::::::::-‐ ´
(__  ̄~" | | )) ̄
 ̄◎ ̄◎ ̄
プライマリキーには「id」フィールドを指定。
またSQLiteだと「integer primary key」を指定するとそのフィールドはオートインクリメントだと判断されます。
これでテーブルは完成ぽ。
確認用につぎのようなレコードを挿入しておきませう。
INSERT INTO blogs(id,timestamp,title,conent) VALUES(1,122345,'test','this is test');
作業が\(^o^)/らプロンプトを終了し、WEBブラウザであくせすしてみませう。
一番上のはそのまんまでおk。
重要なのは緑部分の上から3段目、4段目。
DBの作成に成功すればこのように3,4段目がグリーンになるぽ。
ではモデルつくっちゃうZE☆
モデルは「models」フォルダ内に配置します。
ここにblog.phpというファイルを作成し、以下のように記述をしましょう。
blog.php
<?php
class Blog extends AppModel{
public $name = 'Blog';
}
?>
(゚∀゚)
さて解説。解説するほどでもないが。
モデルクラスは「AppModel」を継承して作成していきますYO。これはコントローラーやビューと一緒。
AppModelの中にはDB操作のための一通りの機能がそろっているので継承するだけでフリーダム!!
クラスの中には$nameメンバー変数を用意し、これに名前を指定しておきます。
これもコントローラーのクラス同様昔の名残ですがおまじない(?)の為記述しておきますYO!
モデルクラスと命令規則;
モデルを作成するときに、最も重要なのは「名前」デス。
モデルクラスは前にも言ったとおり、ファイル名を「テーブル名.php」とし、クラス名をテーブルと同じものにするのが基本です。
今回は「blogs」というテーブルを使用するので、ファイル名は「blog.php」となります。
クラス名は「Blog」となっています。
テーブルはblogsと複数形で、モデルのほうはBlogと単数形になっていますが、これでちゃんと正しくblogsテーブルにアクセスできます。
ではコントローラーとビューを作成していきましょう。
まずコントローラーです。
「controllers」内に、「blogs_controller.php」というファイルを作成し、以下のように記述してください。
<?php
class BlogsController extends AppController{
public $name = 'Blogs';
function index(){
$data = $this->Blog->find('all');
$this->set('data',$data);
}
}
?>
indexで行っているのはBlogモデルからレコード情報を取得し、それを$dataという変数としてビューに設定する、ということだけです。
次にビュー。
「views」フォルダ内に「blogs」フォルダを新たに作り、そこに「index.ctp」ファイルを作成します。
index.ctp
<h1></h1>
<pre>
<?php print_r($data); ?>
</pre>
見ればわかるように、$dataをprint_rで出力させます。モデルから取得したデータの形式が不明なのでprint_rを使ってます。
(゚д゚)完成したらhttp://localhost/cakeapp/blogs へアクセス!ヽ( ^ω^)ノ サクセス!
これでSQLiteのDBのblogsテーブルからレコードが取り出され、変数$dataに設定したものが出力されるようになります。今はダミーが一件のみなので以下のように表示されるはずです。
Array
(
[0]=>Array
(
[Blog]=>Array
(
[id] => 1
[timestamp]=> 122345
[title] => test
[content] => this is test
)
)
)
これが、モデルによってDBのBlogsテーブルから取得したレコード情報です。これは整理すれば次のようになります。
Array
(
[レコード番号]=> Array
(
[テーブル]=>Array
(
[フィールド]=> 値
)
)
)
取得したテーブルは、順番に配列にまとめられます。それぞれの配列内には、テーブルごとのデータが連想配列の形で納められていて、各テーブル内には各フィールドの値がやはり連想配列の形でまとめられています。
この基本的な構造がわかれば、得られたレコード情報を取り出して処理をすることも可能になります。
では実際にちゃんとした形式でレコードの一覧表示をしていってみませう。
$dataから順にレコードを取り出し、そのBlogキーの値を取得すれば、Blogレコードのデータが得られることになります。あとはそこから各フィールドの値を取り出して書き出していけばいいでせう。
でぁ、index.ctpを次のように修正してくだしあ。
<h1>INDEX</h1>
<br/>
<table>
<tr><th>ID</th><th>DATE</th><th>TITLE</th><th>CONTENT</th></tr>
<?php
for($i = 0; $i <count($data); $i++){
$arr = $data[$i]['Blog'];
echo "<tr><td>{$arr['id']}</td>";
echo "<td>".date('Y/n/j',$arr['timestamp'])."</td>";
echo "<td>{$arr['title']}</td>";
echo "<td>{$arr['content']}</td></tr>";
}
?>
</table>
(゚д゚)修正が終わったらhttp://localhost/cakeapp/blogs へレッツアクセスヽ( ^ω^)ノ サクセス!
さて、コントローラーのindexに戻り、解説していきますYO
class BlogsController extends AppController{
public $name = 'Blogs';
function index(){
$data = $this->Blog->find('all');
$this->set('data',$data);
}
}
まずは$this->Blog->find部分。
この$thisに用意されている「Blog」はBlogモデルクラスのインスタンスです。
コントローラーでは、使用するモデルのインスタンスが自動的にモデル名で組み込まれるようになっているのです。
つまりその後の「find」は、Blogモデルクラスに用意されているメソッドを呼び出していた、というわけです。
でぁ、モデルクラスのメソッドのfindについて。
find(モード,オプション);
第一引数のモード:
第一引数は検索のモードとなるテキストを指定するものです。用意されているモードには'all','first','list','count'の4つがあります。これらはそれぞれ以下の様な働きをします。
'all'⇒全レコードを得る。
'first'⇒最初の1レコードのみ取得。
'list'⇒レコードのリストを得る。
'count'⇒レコード数を得る。
一般的なレコード取得には'all'を使用。その他は特殊な情報の取得のため用のようなもんです。
/)
///)
/,.= ゙''"/
/ i f ,.r= '"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
うむ。
つぎに第二引数だぉ!!
第二引数で指定できるオプションは次の通り。
'conditions'⇒検索条件の設定。条件をつけるフィールド名をキーに、検索する値を値とする連想配列として用意する。
'fields'⇒取得するフィールド名を配列として用意する。
'recursive'⇒再帰的に取得する深度。
'order'⇒取得順。順序を示す数字または名前を配列として用意する。
'limit'⇒取得するレコード数
'page'⇒取得するページ数
通常デフォ状態なら特に設定する必要はない。いっそ第二引数なしでじっこうするのも手。
/)
///)
/,.= ゙''"/
/ i f ,.r= '"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
さて、レコードの検索ができたところで次にレコードを追加する処理を追加しよう。
ここでは「add」というアクションを用意し、これで追加を行うことに汁。
まずビューを作成汁。
「views」内「blogs」内に新たに「add.ctp」を作成。以下の通り。
add.ctp
<h1>ADD</h1>
<br/>
<form method="post" action="add">
TITLE:<input type="text" name="title"/>
CONTENT:<textarea name="content"></textarea>
<input type="submit" value="ADD" />
</form>
POSTでADDに送信するフォームです。
次にコントローラー。
BlogsControllerクラスに新たにaddメソッドを追加しませう。
addメソッド
function add(){
if(!empty($this->params['form'])){
$data = array('Blog'=>array());
$data['Blog']['timestamp'] = time();
$data['Blog']['title'] = $this->params['form']['title'];
$data['Blog']['content'] = $this->params['form']['content'];
$this->Blog->save($data);
$this->redirect('.');
}
}
(゚д゚)クワッ
ここまででけたらhttp://localhost/cakeapp/blogs/add へレッツアクセスヽ( ^ω^)ノ サクセス!
ヽ( ^ω^)ノ サクセス!
r'゚'=、
/ ̄`''''"'x、
,-=''"`i, ,x'''''''v'" ̄`x,__,,,_
__,,/ i! i, ̄\ ` 、
__x-='" | /ヽ /・l, l, \ ヽ
/( 1 i・ ノ く、ノ | i i,
| i, {, ニ , .| | i,
.l, i, } 人 ノヽ | { {
}, '、 T`'''i, `ー" \__,/ .} |
.} , .,'、 }, `ー--ー'''" / } i,
| ,i_,iJ `x, _,,.x=" .| ,}
`" ∩ `ー'" ∩ iiJi_,ノ
// | |
//Λ_Λ | |
| |( ´Д`)// <うるせぇ、 スプーぶつけんぞ
\ |
| /
/ /
__ | | __
\  ̄ ̄ ̄ ̄ ̄ \
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
では解説。
レコードの追加は次の形式で行われます。
[モデル]->save(連想配列);
引数に渡す連想配列では、モデル名をキーとする要素が用意されます。
そしてその中に、フィールド名をキーとする連想配列の形で登録するデータが用意されます。
基本IDはオートインクリメントの為DB側で勝手に処理されますが、万が一IDが重複するような事態になった場合、エラーではなくそのIDのレコードを更新します。
つまり、新規登録と更新を兼ね備えているわけです。
すげぇ。スプー並。
りだいれくとについて。
$this->redirect(アドレス);
コントローラーにあるリダイレクトを呼び出して特定のアドレスに移動します。
これはページ遷移の基本として覚えておきませう。
g(^^^^_______,,,,,,;;59q
,,p6l゚゚ ゚l[゛`、]pvn .l[..l
」" 4^゚゚゚゚゚゚゚_][ __,,,, .l[
[゜ ,,g「゚p[{4,, (" ^〉.\
],,,,gl゚" .l[、.;][ .\^^^ .l
]! ゚\ __,,xxx。 ]
][ [゚ ]l. 〈
J! 〔、 .l[ ]
|。_ .\-fff" ,,p
^"^9nxxxx./r==4"゛
ポーニョポーニョポニョ♪
,,,,,,pxxvxxg,,,,_
,,df(^"゛ g、 ^゚゚lq
〈! ,,dl゚゛ ./==x]t,,_
]l.__,,g[,,,,,,,,,,,,,,p4" .l[^k
][「,,pr=t、`、 ____ .l[ ]
g" ][_ ]! ./「゚^゚9,,「n,,]
4゚ .。、.\イ ゚lk ,,g[ .l]
]l. 〈^゚ltn4,,,,_ ]
ヨ。. ゚ll._ ゚"9n......./ff ]
ヨ、.\q,,,,____ ,,gf゛ gl゚
^9nnxxxxx゚゚゚゚゚゚゚゚゚゚xvtf"゛
魚の子 !
グロはんな!!
というわけで次は記事の削除処理を実装していきましょう。
まずは削除用のファイルの作成。
ビュー部分からいきますYO!
「views」フォルダ内の「blogs」フォルダ内に「delete.ctp」というファイルを作成します。
以下delete.ctp
<h1>DELETE</h1>
<br/>
<form method="post" action="delete">
ID:<input type="text" name="id">
<input type="submit" value="DELETE">
</form>
(゚д゚)つぎにコントローラーにdeleteメソッドを追記しますYO!!
blogs_controller.phpにつぎのメソッドを追記。
function delete(){
if(!empty($this->params['form'])){
$this->Blog->del($this->params['form']['id']);
$this->redirect('.');
}
}
(゚д゚)完成したら…
http://localhost/cakeapp/blogs/delete
へレッツアクセスヽ( ^ω^)ノ サクセス!
削除後に一覧画面へリダイレクトされる。結果、No2が削除された。
⊂二二二( ^ω^)二⊃
| / リダイレクトブーン
( ヽノ
ノ>ノ
三 レレ
解説。
レコードの削除は次の書式で実現します。
[モデル]->del( ID );
[モデル]-> remove( ID );
レコードの削除はモデルクラスに用意されている「del」または「remove」というメソッドで行います。
引数に、削除したいレコードのIDを指定して呼び出すと、そのレコードが削除されます。
非常に単純☆ミ
以下余談。
WEBシステム構築時にDBを使用しないほうが珍しい時分。
それゆえ、「DB関連の確認のためにいちいち登録・削除・更新処理を書くなんて」と思ってる人向けにscaffoldについて説明するじぇ(´・ω・`)ノ
「テスト用DBを操作する仮のシステムがほすぃ」
「管理用にDBアクセスする機能がほすぃ」等システムの中の必須部分ではない面でいちいちシステムを一から導入していられるかっ!!て人に最適なのがscaffold。
今から解説するぉ。
とりあえずDB関連のシステムがほしいのよ。という時に活用くだしあ。
Blogモデルを利用するための機能をscaffoldで実現してみませう。
まずはコントローラークラスを次のように修正しませう。
blogs_controller.php
<?php
class BlogsController extends AppController{
public $name = 'Blogs';
function index(){
$data = $this->Blog->find('all');
$this->set('data',$data);
}
function add(){
if(!empty($this->params['form'])){
$data = array('Blog'=>array());
$data['Blog']['timestamp'] = time();
$data['Blog']['title'] = $this->params['form']['title'];
$data['Blog']['content'] = $this->params['form']['content'];
$this->Blog->save($data);
$this->redirect('.');
}
}
function delete(){
if(!empty($this->params['form'])){
$this->Blog->del($this->params['form']['id']);
$this->redirect('.');
}
}
}
?>
↑を↓のように修正。
<?php
class BlogsController extends AppController{
public $name = 'Blogs';
public $scaffold;
}
?>
これでおk。
コントローラーには一切メソッドを用意する必要はありません。
また、ビューも不要。
「views」内に用意した「blogs」フォルダを削除するなり他に移動するなりして取り除きませう。
(゚д゚)クワッ これでなにもなくなった!!さぁどうなる!?
(゚д゚)↑からもわかるようにメソッドもビューもへったくれもなくてもDB関連の処理が実現できてしまうのがscaffoldの機能。
scaffold…恐ろしい子…!!!
画面を確認すればわかるのですが、なんとView Edit Deleteと、一通りの操作が全部行えますYO。
ちなみにscaffoldを使用するための準備はコントローラークラスでメンバー変数「public $scaffold;」を用意するだけ。これだけ。
あとはscaffold側でDB関連の機能一切を担ってくれます。ウホッ、いいscaffold。
scaffoldはすべての機能を使わなくてはならないわけではありませぬ。
コントローラークラスにアクションメソッドがある場合に、そのメソッドが優先されます。
例えばscaffoldのindexメソッドで一覧表示が出ますが、コントローラークラスに他のindexメソッドがあればそちらが優先されます。(もちビューも用意されたものが使われる)
なので一般に使うindexのみ作って他はscaffoldにやってらう、ということも可能ですYO。
./ ;ヽ
l _,,,,,,,,_,;;;;i <いいぞ ベイべー!
l l''|~___;;、_y__ lミ;l 逃げる奴は一般人だ!!
゙l;| | `'",;_,i`'"|;i | 逃げない奴はよく訓練された一般人だ!!
,r''i ヽ, '~rーj`c=/
,/ ヽ ヽ`ー"/:: `ヽ
/ ゙ヽ  ̄、::::: ゙l, ホントモデル解説は地獄だぜ! フゥハハハーハァー
|;/"⌒ヽ, \ ヽ: _l_ ri ri
l l ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| | / |
゙l゙l, l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l
| ヽ ヽ _|_ _ "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ
/"ヽ 'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄ [i゙''''''''''''''''"゙゙゙ ̄`"
/ ヽ ー──''''''""(;;) `゙,j" | | |
長いorz
(゚д゚)というわけでようやくMVCの最後のMが終了。
次回はヘルパーについてやっていきますYO!
TO BE CONTINUED!
