datamapper ormは初めてなので、後で自分の生活を楽にすることができるように、最初にモデルジェネレーターを作成することにしました。
まず、クリーンなci-2フォルダーを作成しました。そしてcontroller/welcome.phpで私は書いた
public function index()
{
$this->output->enable_profiler(TRUE);
$this->load->helper('inflector');
$this->load->helper('file');
echo "<pre>";
//list alll tables in database
$tables = $this->db->list_tables();
//grap all relations for database 'clinic-master'
$relations=$this->db->query("SELECT table_name, column_name,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.key_column_usage
WHERE referenced_table_schema = 'clinic-master'
ORDER BY table_name, column_name");
///looping tables
foreach ($tables as $table){
$x=$this->load->view('db',['table'=>$table,'fields'=>$this->db->list_fields($table)
,'relations'=>$relations],TRUE);
if(write_file("./application/models/dm/$table.php", $x))
echo "<hr><h1>$table</h1><code>$x</code>";
else
echo "<hr><h1>$table</h1><code>Failed to write file</code>";
}
}
およびviews/db.phpには
<?$t=singular($table);echo"<?php";?>
class <?=$t?> extends DataMapper {
public $table = '<?=$table?>';
/*
<?print_r($relations->result());?>
*/
public $has_one = array();
public $has_many = array();
var $validation = array(
<?$x='';foreach($fields as $f){
$x.="'$f' => array(
'rules' => array('required'),
'label' => '<?=$f?>'
),";
}
echo trim($x,',');
?>
);
public $default_order_by = array('id' => 'desc');
// Optionally, don't include a constructor if you don't need one.
function __construct($id = NULL)
{
parent::__construct($id);
}
// Optionally, you can add post model initialisation code
function post_model_init($from_cache = FALSE)
{
}
}
/* End of file <?=$t?>.php */
/* Location: ./application/models/<?=$t?>.php */
今、has_oneとhas_manyをエコーする方法に固執しています!
これは、$relationsのクエリから得られるものの例です。
最初の行の例は、在庫に1つのクリニック参照テーブルクリニックがあり、テーブルクリニックにも多くの在庫があることを示しています。(モデルクリニック、在庫)
だから私は$relationsをループし、たとえばテーブルの発明のために出てきました(最初の2行)は
public $has_one = array(
'clinic' => array(
'class' => 'clinic',
'other_field'=>'clinic',
join_other_as=>'id'
),
'code' => array(
'class' => 'inventory_item',
'other_field'=>'code',
join_other_as=>'id'
)
);
スキーマ::
inventroy:id,code(fk),clinic(fk),amount
clinics : id,name
inventory_item:id,name,min_amount,etc....
code->inventory_item.id
clinic->clinics.id
質問
- それが機能することを確認するために、クラス以外の$ has_one配列に他に何を含める必要がありますか?
- その仕事をする何かがすでに存在していますか?
- wanwizardガイド以外のdatamapperを使用して高度な関係を説明する他のソースを入手した人はいますか?特に、コードのみが含まれ、比較するテーブルスキーマが含まれていないことをよく理解できません。