PHPでテキストファイルを簡易データベースとして使用するTextDbクラス公開!findJoin($join,$con1,$con2)
では、findJoin($join,$con1,$con2)の使い方を説明します。
findJoin($join,$con1,$con2)はテーブルを結合して、且つ指定した条件に合致したレコードを取得します。
引数は3つあり、それぞれ
$join : 結合したいテーブルのTextDbクラスインスタンス
$con1 : もとのテーブルに指定する検索条件
$con2 : 結合したいテーブルに指定する検索条件
です。
今、
このディレクトリ構成で、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を数値で取得する。 |