CakePHP根据同一行中的其他值更新字段值?

时间:2010-07-13 08:09:34

标签: database cakephp mysql

我一直在试图弄清楚如何做到这一点,似乎这不是很多人在cakephp中尝试做的事情,或者我只是完全误解了文档..我使用下面的查询得到一个字段值所以我得到一个值“findbycreated”为0 ...这部分工作正常

$unregisteredemail = $this->Testmodel->findBycreated('0');
$emailaddress = $unregisteredemail['Testmodel']['emailaddress'] ;
$emailpassword = $unregisteredemail['Testmodel']['password'] ;

但是现在,在我使用我检索到的这些数据做一些事情之后,我想在同一行中,在同一模型/表中标记一个字段,值为'1',表示已执行某个操作地方(例如,电子邮件地址已经成功创建)...尽管我努力通过文档和搜索,我还是无法弄清楚如何在cakephp中做到这一点,这应该是相当简单的,我很有诱惑力,在这一点,只是使用常规的mysql查询作为一个简单的查询..基本上是查询(请原谅我的语法,因为我有一段时间没有使用直接的mysql查询)“更新(数据库/表)设置'创建' ='1'其中'emailaddress'= $ emailaddress“

或者我可以使用行ID,如果需要的话,因为cakephp似乎更喜欢这个,但仍然无法得到如何做到这一点..这是我在下面的尝试不起作用:

// update database to show that email address has been created
$this->Testmodel->read('emailaddress', $this->Testmodel->findBycreated('0'))
$this->Testmodel->id = 1;
$this->Testmodel->set(array(
            'created' => '1'
            ));

 $this->Testmodel->save();

5 个答案:

答案 0 :(得分:3)

在这种情况下,我会让Cake处理id并专注于更改行数据并将其重新保存到数据库

$row = $this->Model->findBycreated(0);
$row['Model']['emailaddress'] = 1;
$this->Model->save($row);

这样,你不必担心id,因为id无论如何都会在你的数据集中,所以只需改变你想要的东西,然后告诉Cake保存它。

Ninja编辑,请确保使用id方法返回包含findBycreated()的完整行。

答案 1 :(得分:3)

从前面的答案可以看出,有几种方法可以达到同样的目的。我想解释一下为什么你的方式不起作用。

在模型中,CakePHP根据ORM的实现将数据库行抽象为数组。这为我们提供了一种操作数据并将其放在MVC架构周围的便捷方法。

当你说:

$this->Testmodel->set(array(
            'created' => '1'
            ));

您正在直接处理模型,但数据实际上是作为数组存储在名为$ data的类变量中。要访问和操作此数据,您应该说:

$this->data['Testmodel']['created'] => '1';

将模型名称指定为第一个索引的原因是,在检索到关联表的情况下,可以以相同的方式访问这些表,因此您可能具有以下内容:

Array([Testmodel] => Array ([id] => 1,
                            [created] => [1],
                            ...
                           )
      [Relatedmodel] => Array ([id] => 1,
                               [data] => asd,
                            ...
                           )
     )

......等等。非常方便。

现在,当你使用没有参数的$this-> MyModelName ->save()时,默认使用$ this->数据并使用部分适合于您调用save方法的模型的数据数组。如果由于某种原因您没有(或不能)使用$this->data,您也可以传递一系列数据,格式相同。

您对read()方法的使用不正确。第一个参数应为null,字符串或字符串数​​组(表示fieldname(s))。第二个参数应该是您要读取的记录的ID。相反,对于参数2,您传递的是find的结果,它将是一个数组。您未捕获的结果将为空。

我会写你的代码:

$this->data = $this->Testmodel->read('emailaddress',1); 
$this->data['Testmodel']['created'] = 1;
$this->Testmodel->save();

或更简洁:

$this->Testmodel->id = 1;
$this->Testmodel->saveField('created', 1);

答案 2 :(得分:2)

有很多方法可以做你的工作。我建议你阅读cookbook about saving data in cakephp。除了大卫的解决方案,另一个简单的方法是

$this->Testmodel->id = 1;  
$this->Testmodel->saveField('created' =>'1'); 

答案 3 :(得分:1)

好吧,我想我终于找到了解决方案,我能够让它发挥作用:

$this->Test->updateAll(
  array(
    'Test.field' => 'Test.field+100'
  ),
  array(
    'Test.id' => 1
  )
);

我认为你必须使用updateAll,因为其他东西只会创建一个新行..基本上,CakePHP,无论出于何种原因,都忽略了包含一个只更新一个字段的函数,所以你必须把它放到一个带有updateAll的数组中使它工作......

+100是更新信息所在的位置,因此在这种情况下,“100”将是该字段的更新内容。

答案 4 :(得分:0)

在cakephp 3.x中,语法似乎有所不同。这是在3.x中对我有效的方法:

$this->Tests->updateAll(
    [
        'Tests.field = Tests.field+100'
    ],
    [
        'Tests.id' => 1
    ]
];

区别在于整个表达式必须位于第一个数组的值中。