我一直在试图弄清楚如何做到这一点,似乎这不是很多人在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();
答案 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
]
];
区别在于整个表达式必须位于第一个数组的值中。