2016-07-28 2 views
1

Привет У меня проблема, когда я попытался сохранить атрибут модели в базу данных. Я пишу в OctoberCMS и у меня есть эту функцию:Сохранить атрибут модели в базе данных в PHP в октябреCMS

public function findActualNewsletter() 
    { 
     $actualNewsletter = Newsletter::where('status_id', '=', NewsletterStatus::getSentNowStatus())->first(); 
     if (!$actualNewsletter) { 
      $actualNewsletter = Newsletter::where('send_at', '<=', date('Y-m-d'))->where('status_id', NewsletterStatus::getUnsentStatus())->first(); 

      $actualNewsletter->status_id = NewsletterStatus::getSentNowStatus(); 
      dd($actualNewsletter); 
     } 
     return $actualNewsletter; 
    } 

getSentNowStatus() = 2;

getUnsentStatus() = 1;

дд ($ actualNewsletter) в моем если заявление показывает, что status_id = 2 Но в базе данных я до сих пор 1. Я использовал эту функцию в afterSave(), так что мне не нужно:

$actualNewsletter->status_id = NewsletterStatus::getSentNowStatus(); 
    $actualNewsletter->save(); 

becosue I есть ошибка, тогда я использую save в save. Конечно, я заполнил таблицу $ fillable = ['status_id']. И теперь я не знаю, почему его не сохранить в базе данных, когда он перейдет к моему if. Может, кто-то увидит мою ошибку?

+0

Я никогда не использовал OctoberCMS, но похоже, что вы должны '-> сохранять()' вашу модель, чтобы она сохранялась. https://octobercms.com/docs/database/model#basic-updates –

+0

, но я использовал это в функции afterSave() {есть моя функция}, поэтому я попытался использовать с -> save() проблемой должен быть в другом месте – LukeKov

+0

Я устал, чтобы использовать save() Я пишу об этом в своем сообщении, но он по-прежнему не сохраняет мой атрибут базы данных – LukeKov

ответ

2

Если вы пытаетесь изменить модель на основе какой-то пользовательской логики, а затем сохраните ее, то лучше всего разместить ее в методе модели beforeSave(). Чтобы получить доступ к текущей сохраненной модели, просто используйте $this. Ниже приведен пример метода beforeSave() используется для изменения атрибутов модели, прежде чем она будет сохранена в базе данных:

public function beforeSave() { 
    $user = BackendAuth::getUser(); 
    $this->backend_user_id = $user->id; 

    // Handle archiving 
    if ($this->is_archived && !$this->archived_at) { 
     $this->archived_at = Carbon\Carbon::now()->toDateTimeString(); 
    } 

    // Handle publishing 
    if ($this->is_published && !$this->published_at) { 
     $this->published_at = Carbon\Carbon::now()->toDateTimeString(); 
    } 

    // Handle unarchiving 
    if ($this->archived_at && !$this->is_archived) { 
     $this->archived_at = null; 
    } 

    // Handle unpublishing, only allowed when no responses have been recorded against the form 
    if ($this->published_at && !$this->is_published) { 
     if (is_null($this->responses) || $this->responses->isEmpty()) { 
      $this->published_at = null; 
     } 
    } 
} 

Вам не нужно запускать $this->save() или что-нибудь подобное. Простое изменение атрибутов модели в методе beforeSave() выполнит то, что вы хотите.

+0

, но я использовал это в beforeSave, а затем его эффект не был. Во-вторых, я finnaly хочу использовать эту функцию не в beforeSave, а в taskSchedule с использованием cron, где она должна автоматически работать с моей базой данных. Я имею в виду автоматическую поисковую запись со статусом, и если нет записи с этим статусом, то найдите с критериями в моей инструкции if, а затем перезапишите status_id этой записи. И теперь я использую это -> save() в cron, но это все еще не сохраняет мои данные – LukeKov