プログラミングで飯を食え。腕をあげたきゃ備忘録!

PHP、JavaScript、HTML5、CSS3などWEB系言語を中心に基本テク、備忘録をまとめます。Android、Iphoneアプリ開発についても!

PHPでテキストファイルを簡易データベースとして使用するTextDbクラス公開!findJoin($join,$con1,$con2)

サクウェブTVはコチラ↓↓↓
サクウェブTV

では、findJoin($join,$con1,$con2)の使い方を説明します。

findJoin($join,$con1,$con2)はテーブルを結合して、且つ指定した条件に合致したレコードを取得します。

 

引数は3つあり、それぞれ

$join : 結合したいテーブルのTextDbクラスインスタンス

$con1 : もとのテーブルに指定する検索条件

$con2 : 結合したいテーブルに指定する検索条件

です。

 

今、

f:id:senoway:20130804160245j:plain

このディレクトリ構成で、index.php

require_once 'TextDb.php';
$c_fields = array("id","name","address");
$c_db = new TextDb("tbl/customer.txt","::",$c_fields);

$i_fields = array("id","name","customer_id");
$i_db = new TextDb("tbl/item.txt","::",$i_fields);

と記述してあるとして、customer.txtとitem.txtにそれぞれ

customer.txt
tablename::customer
id::name::address
1::yamada::tokyo
2::tanaka::osaka
3::suzuki::kyoto
4::sato::tokyo
5::sasaki::tokyo
item.txt
tablename::item
id::name::customer_id
1::apple::3
2::orange::2
3::onion::4
4::carrot::3
5::potato::4
6::cabbage::3
7::tomato::1
8::cherry::2
9::radish::1
10::celery::2

のようなレコードがあるとします。

これらのテーブルを結合してレコードを取得してみます。

ここで注意です。

結合する予定のあるテーブル(ここではitemテーブル)では、相手のidを格納するカラムとして、

相手のテーブル名_id

というカラムを必ず作って下さい。

これがなかったり、カラム名を間違えると結合できません。

今回の場合は、itemテーブルのcustomer_idカラムがそれにあたりますね。

 

では最も簡単な結合を行ってみましょう。

$data = $c_db->findJoin($i_db);
print_r($data);

実行結果は、

Array
(
    [customer] => Array
        (
            [1] => Array
                (
                    [id] => 1
                    [name] => yamada
                    [address] => tokyo
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 7
                                    [name] => tomato
                                    [customer_id] => 1
                                )

                            [1] => Array
                                (
                                    [id] => 9
                                    [name] => radish
                                    [customer_id] => 1
                                )

                        )

                )

            [2] => Array
                (
                    [id] => 2
                    [name] => tanaka
                    [address] => osaka
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [name] => orange
                                    [customer_id] => 2
                                )

                            [1] => Array
                                (
                                    [id] => 8
                                    [name] => cherry
                                    [customer_id] => 2
                                )

                            [2] => Array
                                (
                                    [id] => 10
                                    [name] => celery
                                    [customer_id] => 2
                                )

                        )

                )

            [3] => Array
                (
                    [id] => 3
                    [name] => suzuki
                    [address] => kyoto
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 1
                                    [name] => apple
                                    [customer_id] => 3
                                )

                            [1] => Array
                                (
                                    [id] => 4
                                    [name] => carrot
                                    [customer_id] => 3
                                )

                            [2] => Array
                                (
                                    [id] => 6
                                    [name] => cabbage
                                    [customer_id] => 3
                                )

                        )

                )

            [4] => Array
                (
                    [id] => 4
                    [name] => sato
                    [address] => tokyo
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 3
                                    [name] => onion
                                    [customer_id] => 4
                                )

                            [1] => Array
                                (
                                    [id] => 5
                                    [name] => potato
                                    [customer_id] => 4
                                )

                        )

                )

            [5] => Array
                (
                    [id] => 5
                    [name] => sasaki
                    [address] => tokyo
                )

        )

)

です。

全てのレコードで結合したデータを取得するには

引数は、相手のテーブルのインスタンスだけでいいです。

 

結合もとと結合先に検索条件をつける場合のみ、第二引数・第三引数を指定することになります。

 

ではためしに条件をつけて検索してみましょう。

「idが1~3の顧客(customer)が買った商品(item)のうち、idが6~10までのもの」

を抽出する場合を考えます。

「customer.idが1,2,3」で「item.idが6,7,8,9,10」ですから、

$con1 = array(
    "customer.id"=>array(1,2,3)
);
$con2 = array(
  "item.id"=>array(6,7,8,9,10)
);
$data = $c_db->findJoin($i_db,$con1,$con2);
print_r($data);

のようになります。

$con1はもとのテーブル(customerテーブル)の検索条件、

$con2は相手のテーブル(itemテーブル)の検索条件

です。

検索条件の設定方法はfind($conditions)と同じですから、

設定方法がわからない場合は

>>コチラ<<

を確認してください。

さて、実行結果は以下です。

Array
(
    [customer] => Array
        (
            [1] => Array
                (
                    [id] => 1
                    [name] => yamada
                    [address] => tokyo
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 7
                                    [name] => tomato
                                    [customer_id] => 1
                                )

                            [1] => Array
                                (
                                    [id] => 9
                                    [name] => radish
                                    [customer_id] => 1
                                )

                        )

                )

            [2] => Array
                (
                    [id] => 2
                    [name] => tanaka
                    [address] => osaka
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 8
                                    [name] => cherry
                                    [customer_id] => 2
                                )

                            [1] => Array
                                (
                                    [id] => 10
                                    [name] => celery
                                    [customer_id] => 2
                                )

                        )

                )

            [3] => Array
                (
                    [id] => 3
                    [name] => suzuki
                    [address] => kyoto
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 6
                                    [name] => cabbage
                                    [customer_id] => 3
                                )

                        )

                )

        )

)
関数名説明
get()

テーブルの全レコードを取得する。 

find($conditions = array()) 

検索条件を指定してレコードを取得する。

引数がない場合はget()と同じ動作をする。

 findJoin($join,$con1=array(),$con2=array())

テーブルを結合して

指定条件に合致したレコードを取得する。 

save($arr) 

レコードを追加または更新する。

引数の配列にidが指定されている場合は、

そのidのレコードを更新する。idがない場合は追加する。 

updateBase($form)  特定のレコードの特定のカラムを更新する。 
updateAll($arr,$conditions) 

指定した条件に合ったレコードの指定カラムを

一括更新する。 

delete($id)  指定したidのレコードを削除する。 
deleteAll($conditions) 

指定した条件に合ったレコードを

一括削除する。 

getLastId()  最後のレコードのidを数値で取得する。