【问题标题】:Codeigniter how to map a class sent to a modelCodeigniter 如何将发送到模型的类映射
【发布时间】:2011-06-02 14:26:26
【问题描述】:

我有一个具有此功能的 SectorModel:

public function update(Sector $sector) {
        $this->db->where('sector_id', $sector->getScetor_id());
        return $this->db->update(_SECTOR_, $sector);
} 

有时我只会更改 Sector 对象的名称:

$Sector = new Sector();
$Sector->setSector_name = 'test';

$this->SectorModel->update($Sector); 

生成的选择看起来像:

UPDATE realestate_sector SET sector_name = 'teste', sector_description = NULL 

它将更新,但会将所有其他属性设置为 NULL,因为它没有在我的对象上设置。 现在,我必须在发送之前填充整个对象。

有没有办法映射 Sector 类并仅更新对象上发送的内容?

提前感谢您的帮助。

抱歉有错别字,我的英文不好=)

【问题讨论】:

  • 你可以取消设置 NULL 属性

标签: php database codeigniter frameworks model


【解决方案1】:

只需循环遍历所有对象的属性,然后如果有 NULL,只需使用 unset 删除它。

这是为实现这一目标而编辑的模型方法:

public function update(Sector $sector)
{
   foreach($sector as $k=>$v)
   {
      if($v === NULL)
         unset($sector->$k)
   }

   $this->db->where('sector_id', $sector->getScetor_id());
   return $this->db->update(_SECTOR_, $sector);
} 

Here你可以找到一些关于在 PHP 中迭代对象的信息

【讨论】:

    【解决方案2】:

    最简单的做法是使用数组 - 此处的文档http://codeigniter.com/user_guide/database/active_record.html#update - 您只需创建一个包含所有列的数组,其中包含要更新的值并执行$this->db->update('mytable', array('name' => 'test'), array('id' => $id)); 调用。这只会更新您在 First 数组中指定的列。使用第二个数组作为您的 WHERE 表达式。

    我能想到的将其他值设置为 NULL 的唯一原因是,在您的示例中,您创建了一个类的新实例,并且其他值必须设置为空或设置为 NULL .最好(如果是这种情况)从表中获取记录,然后更改填充记录上的值并将其传递给函数进行更新。

    希望对您有所帮助。

    【讨论】:

    • 感谢您的回复 Johann,我正在获取记录并填充对象,但这是一项繁重的工作,并且对于每次更新,我都必须进行 Select,这并不好。关于数组,我在数据库上有很多列,所以对所有更新和插入进行操作会非常费力.....
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多