Aug 8

逆引きrhaco42: 直接sqlを使う

rhacoにはDBのテーブルを扱うメソッドが各種用意されており、それを使えばかなりなことが出来ます。
しかし、どうしてもそれでは大変な場合などがあります。

例えば:
テーブルA→子テーブルB→孫テーブルC
と2階層以上下のリレーションを持つテーブルデータを含めてデータを取り出したい場合
テーブルA→子テーブルB,C,Dがあるとして、テーブルA→テーブルB間のデータのみ取り出したい場合

などがあります。※

その場合はsqlを直接指定することで対応できます。

$db = new DbUtil(Product::connection());
$result = $db->query('select * from products;');

こんな形で使用します。テーブル名がproductsになっているのに注意してください。またsetup時にテーブルの接頭字を指定している場合はそれも含めて下さい。

この時$resultは成功、失敗をbooleanで示します。結果セットは

−−−−−−−−−−−−−−−追記あり−−−−−−−−−−−−−−−
$resultset = $db->base->resultset();

で取得します。getResultset()というメソッドもありますが、これではとれませんのでご注意下さい。
−−−−−−−−−−−−−−−ここまで−−−−−−−−−−−−−−−

$resultsetの中身はフィールド名をキーとした連想配列になります。そこで中身をテーブルオブジェクトに入れ込みたい場合は適宜

ObjectUtil::hashConvObject($resultset,new Product());
//又は
//V::ho($resultset,new Product());

と出来ます。

※追記
本来は
while($db->next()){
  $list[] = $this->getResultset();
}

または
$obj = new Product();
while($db->nextObject($obj)){
  //$objは上のV::ho($resultset,new Product());を適用した後に相当します。
}

で取得するそうです。tokushimaさん=中の人、ありがとうございました。

| comment(0)

このエントリーのはてなブックマーク (-)