Yii2 ActiveRecord::save()不适用于通知

Yii2 ActiveRecord::save()不适用于通知,yii2,Yii2,我对Yii2及其控制器和型号不熟悉。我已安装应用程序并正在运行,但通知未保存在DB中。就像用户评论或关注一篇文章一样,没有显示通知,因为数据没有存储到数据库 代码示例: protected function createNotification($type, $data) { switch($type) { case 'a2a': if($data->asked_to != $data->asked_by) {

我对Yii2及其控制器和型号不熟悉。我已安装应用程序并正在运行,但通知未保存在DB中。就像用户评论或关注一篇文章一样,没有显示通知,因为数据没有存储到数据库

代码示例:

protected function createNotification($type, $data) {
    switch($type) {
        case 'a2a':
            if($data->asked_to != $data->asked_by) {
                $notification = new UserNotifications;
                $notification->user_id = $data->asked_to;
                $notification->type = UserNotifications::TYPE_A2A;
                $notification->details = Yii::t(
                    'app', 
                    $notification->msgs[$type], [
                        'username' => Html::a($data->askedBy->name, ['users/view', 'id' => $data->asked_by, 'slug' => $data->askedBy->slug]),
                        'question' => Html::a($data->question->title, ['questions/view', 'id' => $data->question_id, 'slug' => $data->question->slug])
                    ]
                );
                $notification->date = date('Y-m-d H:i:s');
                // TBD - check for failures
                $notification->save();
            }
        break;

        case 'upvote':
            if($data->answer->user_id != $data->user_id) {
                $notification = new UserNotifications;
                $notification->user_id = $data->answer->user_id;
                $notification->type = UserNotifications::TYPE_UPVOTE;
                $notification->details = Yii::t(
                    'app', 
                    $notification->msgs[$type], [
                        'username' => Html::a($data->user->name, ['users/view', 'id' => $data->user_id, 'slug' => $data->user->slug]),
                        'question' => Html::a($data->answer->question->title, ['questions/view', 'id' => $data->answer->question_id, 'slug' => $data->answer->question->slug])
                    ]
                );
                $notification->date = date('Y-m-d H:i:s');
                // TBD - check for failures
                $notification->save();
            }
        break;

        case 'follow':
            if($data->follower_id != $data->user_id) {
                $notification = new UserNotifications;
                $notification->user_id = $data->user_id;
                $notification->type = UserNotifications::TYPE_FOLLOW;
                $notification->details = Yii::t(
                    'app', 
                    $notification->msgs[$type], [
                        'username' => Html::a($data->follower->name, ['users/view', 'id' => $data->follower_id, 'slug' => $data->follower->slug])
                    ]
                );
                $notification->date = date('Y-m-d H:i:s');
                // TBD - check for failures
                $notification->save();
            }
        break;

        case 'acomment':
            if($data->answer->user_id != $data->user_id) {
                $notification = new UserNotifications;
                $notification->user_id = $data->answer->user_id;
                $notification->type = UserNotifications::TYPE_ANSWER_COMMENT;
                $notification->details = Yii::t(
                    'app', 
                    $notification->msgs[$type], [
                        'username' => Html::a($data->user->name, ['users/view', 'id' => $data->user_id, 'slug' => $data->user->slug]),
                        'question' => Html::a($data->answer->question->title, ['questions/view', 'id' => $data->answer->question_id, 'slug' => $data->answer->question->slug])
                    ]
                );
                $notification->date = date('Y-m-d H:i:s');
                // TBD - check for failures
                $notification->save();
            }
        break;

        case 'qcomment':
            if($data->question->user_id != $data->user_id) {
                $notification = new UserNotifications;
                $notification->user_id = $data->question->user_id;
                $notification->type = UserNotifications::TYPE_QUESTION_COMMENT;
                $notification->details = Yii::t(
                    'app', 
                    $notification->msgs[$type], [
                        'username' => Html::a($data->user->name, ['users/view', 'id' => $data->user_id, 'slug' => $data->user->slug]),
                        'question' => Html::a($data->question->title, ['questions/view', 'id' => $data->question_id, 'slug' => $data->question->slug])
                    ]
                );
                $notification->date = date('Y-m-d H:i:s');
                // TBD - check for failures
                $notification->save();
            }
        break;

        case 'message':
            if($data->to_user != $data->from_user) {
                $notification = new UserNotifications;
                $notification->user_id = $data->to_user;
                $notification->type = UserNotifications::TYPE_MESSAGE;
                $notification->details = Yii::t(
                    'app', 
                    $notification->msgs[$type], [
                        'username' => Html::a($data->fromUser->name, ['users/view', 'id' => $data->from_user, 'slug' => $data->fromUser->slug]),
                        'message' => Html::a(Yii::t('app', 'message'), ['messages/thread', 'id' => $data->parent_id == null ? $data->id : $data->parent_id])
                    ]
                );
                $notification->date = date('Y-m-d H:i:s');
                // TBD - check for failures
                $notification->save();
            }
        break;
    }
}
这是保存通知的代码。但什么也没发生。

即使验证失败,也不会尝试将记录保存到数据库中。您应该从检查
save()
调用的结果和潜在错误开始:

if (!$notification->save()) {
   var_dump($notification->getErrors();
}
或者,您可以跳过验证,但如果您不确定数据是否安全,则这可能是危险的

$notification->save(false);

尝试保存记录之前的最佳做法是如下验证模型:

if($notification->validate()){
  $notification->save();

  // make a log or another action
}else{
  // here you can debbug
  var_dump($notification->getErrors());

  // make a log or another action
}

如果在此之后模型没有显示任何错误,则可能是数据库级别有问题,例如数据类型或某些列的不同长度

是否尝试了
$notification->save(false)是的,我试过了,在谷歌上找到了这个并申请了,但没有成功(检查此链接:-已检查,但仍然没有发生任何事情。事实上,我甚至没有收到任何错误或var_dump事件。我可以猜测
$type
参数值,但是您为
$data
传递了什么,并且,上面的函数看起来是通过其他操作或方法保存的,这意味着您正在调用此函数来保存通知。)如果您无法在数据库中保存任何内容,并且在
save()
中也没有得到任何错误,那么您可能需要再次检查是否在
事务
块中调用上述函数?$this->createNotification('upvote',$existingVote);通过这种方式,控制器被回调,
$existingVote
的值是多少?编辑您的问题并将此信息添加到其中。如果以前有5次向上投票,则会添加新的投票。这没有帮助。显示
VarDumper::dump($existingVote)
的结果。这不必要复杂,因为
save()
已在内部调用
validate()
并在验证未通过时返回
false
。@rob006以下是文档:它更复杂,但更好,因为根据validate()过程或save()中是否有错误,您可以采取不同的操作过程。此文档用于
模型
,该模型没有
保存()
方法。对于活动记录,在加载数据(如中)后直接调用
保存()
,以避免两次运行验证。