CakePHP обновить значение поля на основе другого значения в той же строке?

0

Я пытаюсь понять, как это сделать, и кажется, что это не то, что многие люди пытаются делать в 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();
  • 0
    Просто примечание (так как я вижу, что уже есть два ответа), когда вы работаете на своей локальной машине, отладка (в core.php) установлена в 2. Это сбрасывает весь SQL (и другую полезную информацию), так что вы всегда знайте, что именно происходит или не происходит, в вашем случае.
  • 0
    да, у меня есть это, но это не очень помогает ... это выводит запрос, который кажется правильным, но он просто не выполняет действия в моей базе данных, он продолжает добавлять новое поле, а не обновлять то, которое я указываю
Теги:
database
cakephp

4 ответа

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- > данные и использует часть массива данных, соответствующую модели, которую вы вызываете методом сохранения на, Вы также можете передать массив данных, отформатированный таким же образом, если по какой-то причине вы не используете (или не можете) $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);
  • 0
    Спасибо за разъяснение, теперь я понимаю проблему ... Я просто хотел бы, чтобы в кулинарной книге CakePHP было еще несколько примеров, но теперь я думаю, что думаю об этом, делая это так, как описанные здесь ответы довольно просты.
  • 0
    На самом деле .... Я попробовал это, и он все еще создает новое поле, не обновляя поле с идентификатором, который я указал, я думаю, я все еще пытаюсь понять, почему он всегда вставляет новое поле, а не обновляет то, что я хочу
Показать ещё 1 комментарий
3

В этой ситуации я бы позволил Cake справиться с идентификатором и просто сосредоточиться на изменении данных строки и ее сохранении в базе данных

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

Таким образом, вам не нужно беспокоиться об идентификаторе, так как идентификатор будет в вашем наборе данных, так что просто измените то, что вы хотите, а затем скажите Cake, чтобы сохранить его.

Ninja edit, убедитесь, что вы возвращаете полную строку с помощью id из вашего метода findBycreated().

  • 0
    это возвращает ошибку «Ошибка SQL: 1062: Дублирующая запись« $ key »для ключа« PRIMARY »». Поэтому я думаю, что это попытка вставить, а не обновить
  • 0
    pr() ваши данные в первую очередь, чтобы убедиться, что в строке есть идентификатор. Также вам нужно убедиться, что вы вернули только 1 строку.
2

Есть много способов сделать вашу работу. Я предлагаю вам прочитать кучу книг о сохранении данных в cakephp. Кроме того, решение david другим простым способом было бы

$this->Testmodel->id = 1;  
$this->Testmodel->saveField('created' =>'1'); 
  • 0
    как я уже сказал, я прочитал это .. У меня возникли некоторые затруднения при толковании, извиняюсь, если вопрос казался действительно простым, просто поваренная книга сформулирована не так четко, как могла бы быть ИМО
  • 0
    @ Рик, я думаю, поваренная книга скоро станет твоим хорошим другом. Просто не торопись :)
Показать ещё 1 комментарий
1

Хорошо, я, наконец, нашел решение, я смог заставить это работать:

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

Я думаю, что вам нужно использовать updateAll, поскольку что-то еще просто создаст новую строку. В основном CakePHP по какой-то причине не учитывает функцию для обновления только одного поля, поэтому вы должны поместить ее в массив с updateAll чтобы он работал...

+100 - это место, где обновляется информация, поэтому в этом случае "100" будет тем, что поле обновлено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню