【问题标题】:A Better CodeIgniter Model Structure?更好的 CodeIgniter 模型结构?
【发布时间】:2015-10-01 07:33:12
【问题描述】:

我使用 CodeIgniter for PHP 已经有一段时间了,虽然如果我要重新启动我正在处理的项目,我现在会使用 Laravel,但我现在与 CodeIgniter 密切相关。

PHP 模型设计

我有一个问题/疑问。在探索了其他语言,如 Go (GoLang) 甚至是一点点 Ruby 之后,我注意到 PHP 的一些奇怪之处,并且可能是 CodeIgniter 特有的。

这些模型真的不是模型。它们更像是数据库的接口,仅用于提取数据,这似乎是一种浪费和不必要的。

我想弄清楚在提取数据并像普通对象一样访问之后定义模型并将每个变量分配给它是否是更好的做法。像这样:

class Product_m extends CI_Model {

    public $name;
    private $_table = 'products';

    public function __construct()
    {
        parent::__construct();
    }

    public function get($id)
    {
        $query = $this->db->get_where($this->_table, 'id', $id); //this is off memory.. just an example
        $result = $query->result();
        $this->name = $result[0]->name;
    }

    public function get_all($shop_id)
    {
        $query = $this->db->get($this->_table);
        $result = $query->result();
        // loop and build array of objects...      
    }
}

但问题来了

对于一个返回对象数组的函数,如$this->get_all(),那么这将不起作用,因为在 CI 中你只加载了一次模型。


所以我想我也许可以创建一个单独的类(或扩展类),它实际上就像一个结构并定义了类。这样我就可以在我想创建对象数组时实例化该类,并将对象返回给我的控制器,就像返回$this一样。

所以我来了

class Sp_Product {

    public      $id                 =       0; 
    public      $name;
    public      $images             =       array();

}

class Product_m extends CI_Model {

    private $_table = 'products';
    private $_model = 'Sp_Product';

    public function __construct()
    {
        parent::__construct();
    }

    public function get($id)
    {
        $query = $this->db->get_where($this->_table, 'id', $id); //this is off memory.. just an example
        $result = $query->result();

        $product = new $this->_model;
        $product->id = $id;
        $product->name = $result[0]->name;

        return $product;
    }

    public function get_all($shop_id)
    {
       $query = $this->db->get($this->_table);
       $result = $query->result();

       $products = array();
       foreach($result as $p)
       {
          $product = new $this->_model;
          $product->id = $p->id;
          $product->name = $p->name;
          $products[] = $product;
       }

       return $products;
    }

}

你怎么看?

我已经对此进行了测试,并且可以正常工作。以下是我认为的优点和缺点:

积极因素

  1. 我可以将我的应用程序模型分别设置为我的数据库模型。这意味着如果我更改数据库中的列名,那么我不需要在我的应用程序中更改太多代码。
  2. 这将使未来的编程实践更加清晰。
  3. 它提供了一些结构和一致性。
  4. 如果您由于某种原因无权访问数据库,则会消除歧义。
  5. 我可以在我的模型中使用其他类类型。例如,如果我有嵌套数据模型:产品 > 图像。我可以为我的Sp_Product 对象中的每个图像加载一个Sp_Product_Image

否定

  1. 设置需要额外的工作。
  2. 使用这种方法可能会使用额外的内存,因为模型将被加载以及返回一个对象或一个新对象数组。 对此有何想法和建议?

我觉得我可能已经超越了 CodeIgniter,这就是它显示出它的弱点的地方。我非常愿意接受其他建议,如果我的术语混淆了,请告诉我。

【问题讨论】:

  • @Uchiha 我不知道该把它放在哪里才能真正得到体面的回应,Stackoverflow 过去为我提供了很好的服务,我觉得看看它今天是否会继续这样做是有道理的.
  • 就轮子而言,Raw PHP 是 BC 的石轮,CodeIgniter 是 500 年代的木轮,目前我正在使用 Slim + Twig + 在一组 22 英寸的顿轮上滚动RedBean。也许你不应该担心这个,而是找到一个新的轮子。
  • @r3wt 哈哈,这让我笑了。不错的交货。这是一个很好的观点,但这是一项艰巨的工作。
  • 我实际上正在考虑为所有业务逻辑编写一个新的 API,以便在新项目中与 db 接口,然后一点一点地切换。 @r3wt

标签: php codeigniter oop model-view-controller model


【解决方案1】:

对于 get_where() 方法,CI 期望关联数组作为第二个参数。所以:

$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);

Reference。 顺便说一句,我使用的是MY_Model,它有很多功能可以用于各种任务。

【讨论】:

  • 感谢@Tpojka,但我确实在评论中的代码中说这是内存不足且无关紧要,我正在寻找有关结构而不是函数调用语法的反馈。
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多