cakephp1.3中的查询和更新

时间:2015-10-03 11:08:54

标签: php cakephp cakephp-1.3

想要更新attached_blog_id字段以设置NULL。提前谢谢。

 foreach($this->Event->find('all', array('conditions' => array('Event.attached_blog_id' => $this->id()))) as $attached_blog)
   $this->Event->query('UPDATE armo8427_events' . ' SET attached_blog_id = NULL' . ' WHERE id = ' . $attached_blog['Event']['id']);

1 个答案:

答案 0 :(得分:1)

不要不必要地使用查询

问题中的代码最好写成:

$events = $this->Event->find(
    'all', 
    array(
        'conditions' => array(
            'Event.attached_blog_id' => $this->id()
        )
    )
);

foreach($events as $event) {
    $this->Event->id = $event['Event']['id'];
    $this->Event->saveField('attached_blog_id', null);
}

使用问题中的代码逻辑,根本不需要使用查询

但要高效

问题中的逻辑可以表示为单个sql查询,而不是1 + n:

UPDATE
    events
SET
    attached_blog_id = NULL
WHERE
    attached_blog_id = $id;

即。如果有100个链接的博客,使用foreach循环将发出101个查询,而在一个查询中这是相同的,无论受影响的行数是多少。

在CakePHP中执行此操作的最合适方法是使用updateAll

$id = $this->id(); // From the question
$this->Event->updateAll(
    array('Baker.attached_blog_id' => null), // the update
    array('Baker.attached_blog_id' => $id) // conditions to match
);

应该为使用提供的模型方法无法实现的sql调用保留方法query