Я пытаюсь понять, как это сделать, и кажется, что это не то, что многие люди пытаются делать в cakephp, или я просто полностью недопонимаю документацию. Я использую следующий запрос ниже, чтобы получить значение поля, поэтому я получаю значение, где "findbycreated" равно 0... эта часть отлично работает
$unregisteredemail = $this->Testmodel->findBycreated('0');
$emailaddress = $unregisteredemail['Testmodel']['emailaddress'] ;
$emailpassword = $unregisteredemail['Testmodel']['password'] ;
Но теперь, после того, как я сделал некоторые вещи с этими данными, которые я получил, я хочу отметить поле в той же строке в той же модели/таблице, что и значение "1", чтобы указать, что было предпринято действие (например, адрес электронной почты был успешно создан)... Я просто не могу понять, как это сделать в cakephp, несмотря на мои усилия по просмотру документации и поиску, это должно быть довольно просто, я искушаюсь, этот пункт, чтобы просто использовать обычный запрос mysql как простой запрос.. в основном запрос (пожалуйста, извините мой синтаксис, поскольку я не использовал прямые запросы mysql в то время) "update (database/table) set 'created' = '1', где 'emailaddress' = $emailaddress"
Или я мог бы использовать идентификатор строки, если это необходимо, поскольку 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();
Есть, как вы можете видеть из предыдущих ответов, несколько способов достижения той же цели. Я просто хотел бы немного объяснить, почему ваш способ не работает.
В модели 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- > данные и использует часть массива данных, соответствующую модели, которую вы вызываете методом сохранения на, Вы также можете передать массив данных, отформатированный таким же образом, если по какой-то причине вы не используете (или не можете) $this->data
.
Неправильное использование метода read(). Первым параметром должен быть нуль, строка или массив строк (представляющих имена полей). Второй параметр должен быть идентификатором записи, которую вы хотите прочитать. Вместо этого для param 2 вы передаете результат поиска, который будет массивом. Результат, который вы не захватываете, будет пустым.
Я бы написал ваш код как:
$this->data = $this->Testmodel->read('emailaddress',1);
$this->data['Testmodel']['created'] = 1;
$this->Testmodel->save();
или более лаконично:
$this->Testmodel->id = 1;
$this->Testmodel->saveField('created', 1);
В этой ситуации я бы позволил Cake справиться с идентификатором и просто сосредоточиться на изменении данных строки и ее сохранении в базе данных
$row = $this->Model->findBycreated(0);
$row['Model']['emailaddress'] = 1;
$this->Model->save($row);
Таким образом, вам не нужно беспокоиться об идентификаторе, так как идентификатор будет в вашем наборе данных, так что просто измените то, что вы хотите, а затем скажите Cake, чтобы сохранить его.
Ninja edit, убедитесь, что вы возвращаете полную строку с помощью id
из вашего метода findBycreated()
.
pr()
ваши данные в первую очередь, чтобы убедиться, что в строке есть идентификатор. Также вам нужно убедиться, что вы вернули только 1 строку.
Есть много способов сделать вашу работу. Я предлагаю вам прочитать кучу книг о сохранении данных в cakephp. Кроме того, решение david другим простым способом было бы
$this->Testmodel->id = 1;
$this->Testmodel->saveField('created' =>'1');
Хорошо, я, наконец, нашел решение, я смог заставить это работать:
$this->Test->updateAll(
array(
'Test.field' => 'Test.field+100'
),
array(
'Test.id' => 1
)
);
Я думаю, что вам нужно использовать updateAll, поскольку что-то еще просто создаст новую строку. В основном CakePHP по какой-то причине не учитывает функцию для обновления только одного поля, поэтому вы должны поместить ее в массив с updateAll чтобы он работал...
+100 - это место, где обновляется информация, поэтому в этом случае "100" будет тем, что поле обновлено.