はじめまして。fuelphpの質問よりも
データベースよりの質問になってしまうかもしれません。
「顧客」を表すモデル
Model_Customer
が存在し、その子モデル「履歴」が関連づけられていて
Model_History
が存在するとします。
class Model_Customer extends Model
{
...
protected static $_has_many = array(
'crammerhistories' => array(
'key_from' => 'id',
'model_to' => 'Model_History',
'key_to' => 'customer_id',
'cascade_save' => true,
'cascade_delete' => false,
)
);
}
class Model_History extends \Orm\Model
{
...
protected static $_belongs_to = array(
'customer' => array(
'key_from' => 'customer_id',
'model_to' => 'Model_Customer',
'key_to' => 'id',
'cascade_save' => true,
'cascade_delete' => false,
)
);
}
という具合です。
Model_Customer は
id(int)
name(varchar[64])
をプロパティに持ち、
Model_History は
id(int)
code(int)
customer_id(int)(外部キー)
applied_at(datetime)
をプロパティに持つとします。
親モデル Model_Customer は、子モデル Model_History に対し、
「現在のコードが何か」というのを、
各々のModel_Customerに対し、外部キー(customer_id)がそのモデルIDと同じになるような
Model_Historyを、applied_at(datetime)順にソートして、「最後に来たもの」
(すなわち、最新の時刻のcode)となるように定義します。
例えば
Model_Customer
id | name
----+------
1 | tarou
2 | jirou
Model_History
id | code | customer_id | applied_at
----+------+-------------+-----------
1 | 8 | 1 | 2015/01/21
2 | 5 | 1 | 2015/02/01
3 | 7 | 2 | 2015/02/01
4 | 9 | 2 | 2015/01/21
というテーブルがあったとすると、ここから、
name | code
------+--------
tarou | 5
jirou | 7
というテーブルを作りたいのです。
なお、条件検索もしたいのです。
すなわち、「現在のcode」が 5番 である顧客一覧を生成したい場合です。
方法としてすぐ思いついたのは、
current_codeというカラム(現在のcodeが何であるか)を
Model_Customerに追加することです。
実際、current_codeというカラムを追加することで、
find の where句で current_code を調べる方法で
実装には成功しました。
(ページネーションも組み合わました)
Model_Customer::find('all',array(
'related' => array('histories'),
'where' =>array(
array('current_code','=',5);
),
'limit' => $pagination->per_page,
'offset' => $pagination->offset,
));
ただしこのような方法ですと、
余分なカラムを追加することになってしまいます。
どうにかカラムを追加することなく、子モデルを調べて計算した値が
親モデルの条件検索に反映されるような実装ができませんでしょうか。
わかりにくい文章で大変すみません。
質問は以上になります。