php model->save() 在 Yii2 中不起作用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33759514/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
model->save() Not Working In Yii2
提问by Nana Partykar
Previously, I was not using $model->save()
function for inserting or updating any data. I was simply using createCommand()
to execute query and it was working successfully. But, my team members asked me to avoid createCommand()
and use $model->save();
以前,我没有使用$model->save()
函数来插入或更新任何数据。我只是createCommand()
用来执行查询,它运行成功。但是,我的团队成员要求我避免createCommand()
和使用$model->save();
Now, I started cleaning my code and problem is $model->save();
not working for me. I don't know where i did mistake.
现在,我开始清理我的代码,但问题$model->save();
对我不起作用。我不知道我哪里做错了。
UsersController.php(Controller)
UsersController.php(控制器)
<?php
namespace app\modules\users\controllers;
use Yii;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\swiftmailer\Mailer;
use yii\filters\AccessControl;
use yii\web\Response;
use yii\widgets\ActiveForm;
use app\modules\users\models\Users;
use app\controllers\CommonController;
class UsersController extends CommonController
{
.
.
public function actionRegister() {
$model = new Users();
// For Ajax Email Exist Validation
if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())){
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
else if ($model->load(Yii::$app->request->post())) {
$post = Yii::$app->request->post('Users');
$CheckExistingUser = $model->findOne(['email' => $post['email']]);
// Ok. Email Doesn't Exist
if(!$CheckExistingUser) {
$auth_key = $model->getConfirmationLink();
$password = md5($post['password']);
$registration_ip = Yii::$app->getRequest()->getUserIP();
$created_at = date('Y-m-d h:i:s');
$model->auth_key = $auth_key;
$model->password = $password;
$model->registration_ip = $registration_ip;
$model->created_at = $created_at;
if($model->save()) {
print_r("asd");
}
}
}
}
.
.
}
Everything OK in this except $model->save();
Not printing 'asd'as i echoed it.
除了我回应的$model->save();
不打印“asd”之外,一切都很好。
And, if i write
而且,如果我写
else if ($model->load(Yii::$app->request->post() && $model->validate()) {
}
It's not entering to this if
condition.
不进入这个if
状态。
And, if i write
而且,如果我写
if($model->save(false)) {
print_r("asd");
}
It insert NULL to all columns and print 'asd'
它向所有列插入 NULL 并打印“asd”
Users.php(model)
Users.php(模型)
<?php
namespace app\modules\users\models;
use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;
use yii\helpers\Security;
use yii\web\IdentityInterface;
use app\modules\users\models\UserType;
class Users extends ActiveRecord implements IdentityInterface
{
public $id;
public $first_name;
public $last_name;
public $email;
public $password;
public $rememberMe;
public $confirm_password;
public $user_type;
public $company_name;
public $status;
public $auth_key;
public $confirmed_at;
public $registration_ip;
public $verify_code;
public $created_at;
public $updated_at;
public $_user = false;
public static function tableName() {
return 'users';
}
public function rules() {
return [
//First Name
'FirstNameLength' => ['first_name', 'string', 'min' => 3, 'max' => 255],
'FirstNameTrim' => ['first_name', 'filter', 'filter' => 'trim'],
'FirstNameRequired' => ['first_name', 'required'],
//Last Name
'LastNameLength' => ['last_name', 'string', 'min' => 3, 'max' => 255],
'LastNameTrim' => ['last_name', 'filter', 'filter' => 'trim'],
'LastNameRequired' => ['last_name', 'required'],
//Email ID
'emailTrim' => ['email', 'filter', 'filter' => 'trim'],
'emailRequired' => ['email', 'required'],
'emailPattern' => ['email', 'email'],
'emailUnique' => ['email', 'unique', 'message' => 'Email already exists!'],
//Password
'passwordRequired' => ['password', 'required'],
'passwordLength' => ['password', 'string', 'min' => 6],
//Confirm Password
'ConfirmPasswordRequired' => ['confirm_password', 'required'],
'ConfirmPasswordLength' => ['confirm_password', 'string', 'min' => 6],
['confirm_password', 'compare', 'compareAttribute' => 'password'],
//Admin Type
['user_type', 'required'],
//company_name
['company_name', 'required', 'when' => function($model) {
return ($model->user_type == 2 ? true : false);
}, 'whenClient' => "function (attribute, value) {
return $('input[type=\"radio\"][name=\"Users[user_type]\"]:checked').val() == 2;
}"], #'enableClientValidation' => false
//Captcha
['verify_code', 'captcha'],
[['auth_key','registration_ip','created_at'],'safe']
];
}
public function attributeLabels() {
return [
'id' => 'ID',
'first_name' => 'First Name',
'last_name' => 'Last Name',
'email' => 'Email',
'password' => 'Password',
'user_type' => 'User Type',
'company_name' => 'Company Name',
'status' => 'Status',
'auth_key' => 'Auth Key',
'confirmed_at' => 'Confirmed At',
'registration_ip' => 'Registration Ip',
'confirm_id' => 'Confirm ID',
'created_at' => 'Created At',
'updated_at' => 'Updated At',
'verify_code' => 'Verification Code',
];
}
//custom methods
public static function findIdentity($id) {
return static::findOne($id);
}
public static function instantiate($row) {
return new static($row);
}
public static function findIdentityByAccessToken($token, $type = null) {
throw new NotSupportedException('Method "' . __CLASS__ . '::' . __METHOD__ . '" is not implemented.');
}
public function getId() {
return $this->id;
}
public function getAuthKey() {
return $this->auth_key;
}
public function validateAuthKey($authKey) {
return $this->auth_key === $auth_key;
}
public function validatePassword($password) {
return $this->password === $password;
}
public function getFirstName() {
return $this->first_name;
}
public function getLastName() {
return $this->last_name;
}
public function getEmail() {
return $this->email;
}
public function getCompanyName() {
return $this->company_name;
}
public function getUserType() {
return $this->user_type;
}
public function getStatus() {
return $this->status;
}
public function getUserTypeValue() {
$UserType = $this->user_type;
$UserTypeValue = UserType::find()->select(['type'])->where(['id' => $UserType])->one();
return $UserTypeValue['type'];
}
public function getCreatedAtDate() {
$CreatedAtDate = $this->created_at;
$CreatedAtDate = date('d-m-Y h:i:s A', strtotime($CreatedAtDate));
return $CreatedAtDate;
}
public function getLastUpdatedDate() {
$UpdatedDate = $this->updated_at;
if ($UpdatedDate != 0) {
$UpdatedDate = date('d-m-Y h:i:s A', strtotime($UpdatedDate));
return $UpdatedDate;
} else {
return '';
}
}
public function register() {
if ($this->validate()) {
return true;
}
return false;
}
public static function findByEmailAndPassword($email, $password) {
$password = md5($password);
$model = Yii::$app->db->createCommand("SELECT * FROM users WHERE email ='{$email}' AND password='{$password}' AND status=1");
$users = $model->queryOne();
if (!empty($users)) {
return new Users($users);
} else {
return false;
}
}
public static function getConfirmationLink() {
$characters = 'abcedefghijklmnopqrstuvwxyzzyxwvutsrqponmlk';
$confirmLinkID = '';
for ($i = 0; $i < 10; $i++) {
$confirmLinkID .= $characters[rand(0, strlen($characters) - 1)];
}
return $confirmLinkID = md5($confirmLinkID);
}
}
Any help is appreciable. Please Help me.
任何帮助都是可观的。请帮我。
回答by scaisEdge
It could be a problem related with your validation rules.
这可能是与您的验证规则相关的问题。
Try, as a test, to save the model without any validation in this way:
作为测试,尝试以这种方式保存模型而不进行任何验证:
$model->save(false);
If the model is saved you have conflict with your validation rules. Try selectively removing your validation rule(s) to find the validation conflict.
如果模型已保存,则您的验证规则会发生冲突。尝试有选择地删除您的验证规则以查找验证冲突。
If you have redefined the value present in active record you don't assign the value to the var for db but for this new var and then are not save.
如果您重新定义了活动记录中存在的值,则不会将该值分配给 db 的 var,而是为这个新的 var 分配值,然后不会保存。
Try removing the duplicated var.. (only the vars non mapped to db should be declared here.)
尝试删除重复的 var..(只应在此处声明未映射到 db 的 vars。)
回答by Pavle Li
I guess $model->load()
returns false
, call $model->errors
to see model's error.
我想$model->load()
返回false
,调用$model->errors
以查看模型的错误。
$model->load();
$model->validate();
var_dump($model->errors);
回答by David
As @scaisEdge suggest, try removing all table related field in your Usersclass
正如@scaisEdge 建议的那样,尝试删除用户类中的所有与表相关的字段
class Users extends ActiveRecord implements IdentityInterface
{
/* removed because this properties is related in a table's field
public $first_name;
public $last_name;
public $email;
public $password;
public $user_type;
public $company_name;
public $status;
public $auth_key;
public $confirmed_at;
public $registration_ip;
public $verify_code;
public $created_at;
public $updated_at;
public $user_type;
public $company_name;
public $status;
public $auth_key;
public $confirmed_at;
public $registration_ip;
public $verify_code;
public $created_at;
public $updated_at;
*/
// this is properties that not related to users table
public $rememberMe;
public $confirm_password;
public $_user = false;
public static function tableName() {
return 'users';
}
/* ........... */
}
回答by Ruslan Novikov
Check model saving error like this :
检查模型保存错误,如下所示:
if ($model->save()) {
} else {
echo "MODEL NOT SAVED";
print_r($model->getAttributes());
print_r($model->getErrors());
exit;
}
回答by Devang
The other solution mentioned $model->save(false);
. That is just a temporary workaround, and you should still find the actual reason why the save functionality is not working.
提到的其他解决方案$model->save(false);
。这只是一个临时解决方法,您仍然应该找到保存功能不起作用的实际原因。
Here are additional steps to help diagnose the actual issue:
以下是帮助诊断实际问题的其他步骤:
- check that
_form
input field has the proper name, and - check that if you have added any dropdown functionality, then check whether it's working properly or not
- 检查
_form
输入字段是否具有正确的名称,以及 - 检查是否添加了任何下拉功能,然后检查它是否正常工作
回答by Nuriddin Rashidov
You are doing all staff correct. I think u must add one line for confirm password validation
你做的所有员工都是正确的。我想你必须添加一行来确认密码验证
if(!$CheckExistingUser) {
$auth_key = $model->getConfirmationLink();
$password = md5($post['password']);
$registration_ip = Yii::$app->getRequest()->getUserIP();
$created_at = date('Y-m-d h:i:s');
$model->auth_key = $auth_key;
$model->password = $password;
$model->confirm_password= md5($post["confirm_password"]); /// add this line
$model->registration_ip = $registration_ip;
$model->created_at = $created_at;
And Also after this condition check model attributes and error like this :
并且在此条件之后检查模型属性和错误如下:
if($model->save()) {
print_r("asd");
}else{
var_dump($model);exit;}
回答by kaizer
Try this:
尝试这个:
$model->save(false);
and if thats working, check your model rules() and your form rules() if its having the same rules. usually the cause is the required fields in your table.
如果这有效,请检查您的模型规则()和表单规则()是否具有相同的规则。通常原因是表格中的必填字段。
回答by Mahmut Ayd?n
if your column type in your table is "integer" and your data is "string" you may see tis error.You should check your data type and try again.
如果表中的列类型是“整数”而数据是“字符串”,您可能会看到错误。您应该检查您的数据类型并重试。
I suppose that your column type is integer, you should write the following code:
我假设您的列类型是整数,您应该编写以下代码:
$model->created_at=time();//1499722038
$model->save();
but your column type is string, you should write the following code:
但是您的列类型是字符串,您应该编写以下代码:
$model->created_at=date('d/m/Y');//11/07/2017
$model->save();
回答by stakavi
And there maybe another reason of not saving model - you have property of your Users class and before saving from form its reset to NULL.
可能还有另一个不保存模型的原因 - 您拥有 Users 类的属性,并且在从表单中将其重置为 NULL 之前保存。
So, if you set $model->saveAttributes('favorite_book'=>$model->favorite_book), but at that time you declared in class Users public $favorite_book - you will get this field empty in DB.
因此,如果您设置 $model->saveAttributes('favorite_book'=>$model->favorite_book),但当时您在类 Users public $favorite_book 中声明 - 您将在 DB 中将此字段设为空。
回答by Amitesh Kumar
in your model i found First name , last name , email , password is required fields and in your controller you are updating or saving only
在您的模型中,我发现名字、姓氏、电子邮件、密码是必填字段,而在您的控制器中,您只更新或保存
$model->auth_key = $auth_key;
$model->password = $password;
$model->confirm_password= md5($post["confirm_password"]); /// add this line
$model->registration_ip = $registration_ip;
$model->created_at = $created_at;
but first name and last name and email id are required so it will throw validation error , to check this error use
但是名字和姓氏和电子邮件ID是必需的,所以它会抛出验证错误,检查这个错误使用
$model->load();
$model->validate();
var_dump($model->errors);
it will show you the error . correct that errors then model will get save. you can solve that error using Scenario or
它会告诉你错误。纠正错误,然后模型将得到保存。您可以使用 Scenario 或
$model->saveAttributes('favorite_book'=>$model->favorite_book,'favorite_movie'=>$model->favorite_movie);
I hope it will help you.
我希望它会帮助你。