2014-11-16 5 views
0

У меня есть простая программа личных сообщений, которая отправляет сообщения другим пользователям. Они могут отправлять сообщение не более чем одному человеку, как в случае обычной электронной почты. Тем не менее, когда я перебираю получателей, чтобы добавить сообщение в базу данных для каждого из них, его сохранение только одного из них.Laravel Eloquent ORM - как сохранить несколько экземпляров в одной функции

Нужно ли создавать новый экземпляр модели сообщений для каждого цикла?

MessagesController:

public function store() { 

    // Validate the message data 
    if(! $this->isValid(Input::all(), $this->message)) 
     return Redirect::back()->withInput()->withErrors($this->message->inputErrors); 

    if(! $this->message->sendMessage(Input::all())) { 
     //log error to logger 
     $errorNum = $this->logger->createLog('MessagesController', 'store', 'Failed to add message to DB.', Request::url(), Request::path(), 8); 
     Session::put('adminDangerAlert', 'Error #'. $errorNum . ' - Something went wrong attempting to save the message to the database. Contact an administrator if this continues.'); 
     return Redirect::back()->withInput(); 
    } 

    Session::put('adminSuccessAlert', 'Message sent.'); 
    return Redirect::to('admin/messages'); 
} 

Сообщение Модель:

public function sendMessage($input) { 

    $string = App::make('StringClass'); 

    for($i = 0; $i < count($input['recipients']); $i++) { 
     //save new message to DB 
     $this->sender   = intval(Auth::id()); 
     $this->recipient  = intval($input['recipients'][$i]); 
     $this->subject   = $string->nullifyAndStripTags($input['subject']); 
     $this->body    = $string->nullifyAndStripTags($input['body'], '<b><p><br><a><h1><h2><h3><h4><h5><h6><i><blockquote><u><ul><ol><li>'); 
     $this->save(); 
    } 

    return true; 
} 
+0

В идеале рекурсия должна выполняться в контроллере. –

+0

@AliGajani Пробовал это тоже. Все еще добавлено только 1 сообщение в базу данных. –

ответ

0

Ваш метод [email protected] рекурсивно обновляет ту же самую точную модель, не создавая новые модели.

Как сказал Ali Gajani, это лучше сделать в контроллере. Вы не указали свою попытку сделать это в контроллере, но такая же проблема, вероятно, происходила и там.

Вот что ваш метод [email protected] должен выглядеть (непроверенные):

public function store() { 
    $input = Input:all(); 

    // Validate the message data 
    if(! $this->isValid($input, $this->message)) 
     return Redirect::back()->withInput()->withErrors($this->message->inputErrors); 

    $string = App::make('StringClass'); 

    for($i = 0; $i < count($input['recipients']); $i++) { 
     // save new message to DB 
     $message = $this->message->create(array(
      'sender' => intval(Auth::id()), 
      'recipient' => intval($input['recipients'][$i]), 
      'subject' => $string->nullifyAndStripTags($input['subject']), 
      'body'  => $string->nullifyAndStripTags($input['body'], '<b><p><br><a><h1><h2><h3><h4><h5><h6><i><blockquote><u><ul><ol><li>') 
     )); 

     // You can now access the newly created message in this iteration 
     // via $message. 
     // If it wasn't created, $message->exists will be false. 
    } 

    Session::put('adminSuccessAlert', 'Message sent.'); 
    return Redirect::to('admin/messages'); 
} 

Теперь мы рекурсивно создавать с помощью [email protected], а не только обновления свойств того же модели.

Я не включил проверку ошибок, которая вернет Failed to add message to DB., так как [email protected] всегда возвращал истину в любом случае, но вы могли довольно легко включить транзакцию, чтобы обеспечить отправку всех сообщений или отправка сообщений.

Смежные вопросы