Laravel Eloquent ORM - 如何在单个函数中保存多个实例

时间:2014-11-16 07:02:36

标签: php laravel laravel-4 eloquent

我有一个简单的私人消息程序,可以向其他用户发送消息。他们可以将消息发送给不止一个人,就像普通电子邮件一样。但是,当我循环收件人为每个收件人添加一条消息时,它只保存其中一个。

我是否需要为每个循环创建一个新的消息模型实例?

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;
}

1 个答案:

答案 0 :(得分:0)

您的Message@sendMessage方法以递归方式更新相同的模型,而不是创建新模型。

正如Ali Gajani所说,在控制器中做得更好。你没有在控制器中尝试这样做,但同样的问题也可能在那里发生。

这是MessagesController@store方法的样子(未经测试):

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');
}

现在我们使用Message@create递归创建,而不仅仅是更新相同模型的属性。

我没有包含将返回Failed to add message to DB.的错误检查,因为Message@sendMessage无论如何总是返回true,但您可以相当容易地合并事务以确保所有邮件都发送或没有邮件发送