活动记录与裸sql

时间:2011-02-11 23:17:07

标签: php codeigniter orm activerecord

如果没有充分理由,我很自豪不接受概念。但我对使用活动记录模式存在疑问。目前我正在使用zend但是说代码Igniter有活动记录。

我不用。因为

  • sql是sql,它有自己的语法。
  • 你可以复制到sql编辑器,它可以工作(如果它正常工作!)
  • 你不学习另一种语法
  • 如果活动记录按照预期的方式编写SQL,则不需要终止脚本来收集

    但有效记录有

  • 你假装写作客观的php。
  • 当你需要移动另一个db(oracle> mysql:p)时,你不需要将rand函数更改为random,活动记录可以为你创建。

    活动记录是否具有我失踪的更多功能?你能举出一些活动记录可以节省生命的案例吗?

  • 1 个答案:

    答案 0 :(得分:2)

    ActiveRecord

      

    在数据库表或视图中包装行的对象,封装数据库访问,并在该数据上添加域逻辑。

    这是 CodeIgniter使用的内容。 CI的AR是basic query object

    ActiveRecord的主要好处是它的简单性。如果您的应用程序主要执行简单的CRUD操作并且您的表结构与ActiveRecord非常接近,那么这是一个不错的选择。在这种情况下,很容易抽象CRUD。并且您仍然可以为其添加手工SQL以进行某些更复杂的行操作。

    class User
    {
        protected static $dbAdapter;
        protected $username;
        …
    
        public static function findById($id)
        {
            $result = self::$dbAdapter->query(
                sprintf('SELECT * FROM users WHERE id = %d', $id)
            );
            if($result) {
                return new User($result);
            }
        }
    
        public function create()
        {
            try {
                return self::$dbAdapter->query(
                    sprintf(
                        'INSERT into users …', 
                        $this->username, 
                        …
                    );
                );
            } catch …
        }
    
        …
    }
    

    你可以在你的应用程序中使用它:

    $john = User::findById(123);
    echo $user->username; // John
    
    $jane = new User(array(
        'username' => 'Jane'
    ));
    $jane->create();
    

    如果你的行和AR不匹配,你肯定不想使用ActiveRecord。 AR是表示数据库行的对象。 AR将对象设计与数据库设计相结合。 AR不是ORM。试图将其纳入其中是不切实际的。如果您发现需要更多多汁的域模型,您将不会满意,因为它会最终妨碍您的开发,因为对象关系阻抗不匹配。

    附加读物: