如何让模型自动获取表名和主键及spClass的第三个参数问题

#1 暗夜星辰

我们都知道在model中可以定义 相关联的表名和主键如:

 
class demo extends spModel
{
      public  $pk = 'id'; // 每个留言唯一的标志,可以称为主键
      public  $table = 'table_name'; // 默认的数据表的名称
      
      ... ...
}


我看到spClass比例子中有更多的参数选择

object spClass(string class_name, array args, mixed sdir)


其中有一个 array args 可以选择传参 我就想 那么我的主键和表明 是不是可以通过这个传进去呢?

我就做了一个实验

 
class lib_sqlite extends spModel
{
      public  $pk = 'id'; // 每个留言唯一的标志,可以称为主键
      public  $table = 'sqlite_master'; // 默认的数据表的名称
      
      public function __construct($id,$table)
      {
          $this->table = $table?$table:'sqlite_master';
    $this->pk = lib_sqlite::getPk($this->table);
    if($id)$this->pk = $id;
          $this->_db = spDB($this->table)->_db;
      }
   public function getPk($table){
    $pk = '';
    $table_name = $table?$table:$this->table;
    $table_info = spDB($table_name)->_db->getTableinfo($table_name);
    foreach($table_info as $key => $v){
    if($v['pk'] == 1){
       //$this->pk = $v['name'];
       $pk = $v['name'];
       break;
    }
     }
    return $pk;   
   }
     
      
}



dump()之后的代码如下:

 
Array
(
    [c] => main
    [a] => index
    [table] => category
    [SQLiteManager_currentTheme] => PMA
    [SQLiteManager_currentLangue] => 13
    [SQLiteManager_fullText] => 1
    [SQLiteManager_HTMLon] => 0
    [PHPSESSID] => 78671cd6b4032c584ac8884ff1554294
)


lib_sqlite Object
(
    [pk] => cid
    [table] => category
    [verifier] =>
    [addrules] => Array
        (
        )

    [linker] =>
    [tbl_name] =>
    [_db] => db_sqlite Object
        (
            [conn] => Resource id 15
            [arrSql] => Array
                (
                    [0] => PRAGMA table_info (category)
                    [1] => PRAGMA table_info (category)
                    [2] => select name from sqlite_master where type='table';
                    [3] => select * from category;
                    [4] => select * from category;
                )

        )

)



基本上算是实现了功能 但是我不知道这样写对不对 特别是对spClass参数的使用上

本人学习PHP时间不长 如有错误还 请Jack指正

2011-10-14 14:12:09

#2 暗夜星辰

还有这里我很疑惑

上面那个构造函数中有这样一段


 
''''
      public function __construct($id,$table)
      {
          $this->table = $table?$table:'sqlite_master';
          $this->pk = lib_sqlite::getPk($this->table);
          if($id)$this->pk = $id;
          $this->_db = spDB($this->table)->_db; //这里如果不处理的话 数据源就没了??
      }
''''


这是为什么呢?

2011-10-14 14:22:28

#3 Pony

用了spModel就不需要用spDB了,你完全可以简化这些代码,你不能直接使用spModel是因为你的构造函数重写了,记得parent::
class lib_sqlite extends spModel
{
      public  $pk = 'id'; // 每个留言唯一的标志,可以称为主键
      public  $table = 'sqlite_master'; // 默认的数据表的名称
      
      public function __construct($id,$table)
      {          parent::__construct();
          $this->table = $table ? $table : 'sqlite_master';
          $this->pk = $id ? $id : 'id';
      }
}

2011-10-14 15:24:18

#4 暗夜星辰

回复 3 Pony

受教了 ~   

我原以为 这里也要加上参数

parent::__construct();

原来这样 :) 非常感谢

2011-10-14 15:34:14

#5 暗夜星辰

另外 贴下 那个获取表字段属性的函数 是我改造了 内核的sqlite的驱动

 
/**
  * 获取数据表结构
  *
  * @param tbl_name  表名称
  */
public function getTableinfo($tbl_name)
{
  
  $sql = "PRAGMA table_info (".$tbl_name.")";
  $columns = $this->getArray($sql);
  return $columns;
}


放在SpeedPHP/Drivers/sqlite.php内的
执行将返回数组形式的数据表列的属性

2011-10-14 15:38:17