
Originally Posted by
Hgiel
When it come to outputting preferences to screen, I assume I'd really need it in the reverse?
Not exactly.
PHP Code:
$prefs =
Preference::find(
array(
'include'=>'preference_option'
)
,array(
'include'=>'unit'
)
,array(
'include'=>'site'
)
);
That would auto generate and run this SQL:
Code SQL:
SELECT
t0.`preference_id` AS t0_preference_id
,t0.`participant_id` AS t0_participant_id
,t0.`preference_option_id` AS t0_preference_option_id
,t0.`preference_number` AS t0_preference_number
,t1.`preference_option_id` AS t1_preference_option_id
,t1.`pref_form_section_id` AS t1_pref_form_section_id
,t1.`unit_id` AS t1_unit_id
,t1.`display_order` AS t1_display_order
,t1.`is_displayed` AS t1_is_displayed
,t2.`unit_id` AS t2_unit_id
,t2.`site_id` AS t2_site_id
,t2.`unit_name` AS t2_unit_name
,t3.`site_id` AS t3_site_id
,t3.`site_name` AS t3_site_name
FROM
preference AS t0
INNER
JOIN
preference_option AS t1
ON
t0.preference_option_id = t1.preference_option_id
INNER
JOIN
unit AS t2
ON
t1.unit_id = t2.unit_id
INNER
JOIN
site AS t3
ON
t2.site_id = t3.site_id
Which in turn would return object that made it possible to do:
PHP Code:
$prefs[2]->preference_option->unit->site->site_name;
This is a example of how the models would be set-up to generate that output:
PHP Code:
<?php
class Site extends ActiveRecord {
public static $table = 'site';
public static $primaryKey = 'site_id';
public static $fields = array('site_id','site_name');
public static $hasMany = 'units';
public static function find() {
$args = func_get_args();
return parent::_find(__CLASS__,$args);
}
}
class Unit extends ActiveRecord {
public static $table = 'unit';
public static $primaryKey = 'unit_id';
public static $fields = array(
'unit_id'
,'site_id'
,'unit_name'
);
public static $foreignKeys = array(
'site_id'=>'Site'
);
public static $belongsTo = 'site';
public static $hasMany = array('preference_options');
public static function find() {
$args = func_get_args();
return parent::_find(__CLASS__,$args);
}
}
class PreferenceOption extends ActiveRecord {
public static $table = 'preference_option';
public static $primaryKey = 'preference_option_id';
public static $fields = array(
'preference_option_id'
,'pref_form_section_id'
,'unit_id'
,'display_order'
,'is_displayed'
);
public static $foreignKeys = array(
'unit_id'=>'Unit'
,'pref_form_section_id'=>'PrefFormSection'
);
public static $hasMany = array('preferences');
public static function find() {
$args = func_get_args();
return parent::_find(__CLASS__,$args);
}
}
class PrefFormSection extends ActiveRecord {
public static $table = 'pref_form_section';
public static $primaryKey = 'pref_form_section_id';
public static $fields = array(
'pref_form_section_id'
,'pref_form_section_name'
);
public static $hasMany = array('preference_options');
public static function find() {
$args = func_get_args();
return parent::_find(__CLASS__,$args);
}
}
class Preference extends ActiveRecord {
public static $table = 'preference';
public static $primaryKey = 'preference_id';
public static $fields = array(
'preference_id'
,'participant_id'
,'preference_option_id'
,'preference_number'
);
public static $foreignKeys = array(
'preference_option_id'=>'PreferenceOption'
);
public static $belongsTo = 'preference_option';
public static function find() {
$args = func_get_args();
return parent::_find(__CLASS__,$args);
}
}
To create something generic like this though is a project in itself. It will be easier to hard code everything. At least that is relatively straightforward. Building something like this not so much.
Bookmarks