如何在我的模型中避免样板代码?

Posted

技术标签:

【中文标题】如何在我的模型中避免样板代码?【英文标题】:How to avoid boilerplate code in my models? 【发布时间】:2012-05-16 16:24:30 【问题描述】:

我正在使用 CI,但是这个问题通常适用于模型和数据库持久性。我发现自己在以下模型中创建方法:-

private function create_joins() 
  # Add some joins to the global db object using the active record 

我这样做是为了随后可以为特定模型执行通用连接,而无需复制用于创建连接的代码。

所以一个选择方法可能是:-

public function get_by_id($id) 

    $this->db->select('some_cols');
    $this->db->from('some_table');
    $this->create_joins();
    $this->db->where(array('id' => $id));
    etc...

这很好,但我想知道这是否是像数据映射器这样的 ORM 可以抽象掉的那种东西?

【问题讨论】:

【参考方案1】:

你应该试试Doctrine,这是 php 中最先进的 ORM 之一:

使用 Doctrine,您甚至不必在模型中编写诸如 get_by_id($id) 之类的方法:它们由 Doctrine 自己处理。 所以你可以写:

$entityManager->find("Bug", $id);

【讨论】:

Integrating Doctrine with CodeIgniter 一个有价值的替代品是Datamapper ORM,一个专门用于codeigniter的ORM。 谢谢,我会调查这两个【参考方案2】:

另一种方法是通过sparks 使用php-activerecord

关联示例 -

class User extends ActiveRecord\Model

    //set tablename 
    //I would advice to keep Model singular and table names plural
    //then this next step is not needed
    static $table_name = 'table_one';

    //set relationships
    static $belongs_to array(
        array('Group')
    );

    static $has_many = array(
       array('Comment'),
       array('Order')
    );

    static $has_one = array(
       array('Additional_Info')
    );

    //one key feature is callbacks
    //this helps keep controllers clean by letting you pass
    //the post data(after validation) in to modify(serialize,json_encode,calculate vat etc) 

    static $before_create = array('json_encode_my_tags');

    public function json_encode_my_tags()
        //$this->tags === $this->input->post('tags');
        $tags = explode(',', str_replace(' ', '', $this->tags));
        return $this->tags = json_encode($tags, TRUE);
    


//calling a model and using eager-loading for associations
$model = User::find(array(
    'conditions'    =>    array('id=?', $id) // PK Primary key
    'include'       =>   array('comment', 'order', 'additional_info') // eager-loading associations
)); 

$model->key;
$model->comment->key;
$model->additional_info->key;
$model->order->key;

【讨论】:

以上是关于如何在我的模型中避免样板代码?的主要内容,如果未能解决你的问题,请参考以下文章

避免 Equatable 和 Hashable 样板,Swift 4.2

在 Django 中,如何使用模板和 DB 对象中使用的动态 URL 实现样板 HTML 变量?

如何避免“超出 GET/POST 参数数量”错误?

如何在 swift 中避免由于 AFNetworking 导致的内存泄漏

如何避免循环中断?

我如何建模这种关系(避免循环)?